software/ors-amarisoft: enb.jinja2.cfg: Stop using C Preprocessor and switch to Jinja2 completely
To support multiple Radio Units and multiple cells, we will need to loop over them and emit corresponding configuration parts taking RU/Cell parameters into account for each part. We currently handle some such parameters at Jinja2 level (e.g. dl_earfcn), while some other parameters at CPP level (e.g. cell bandwidth) and rely on enb to preprocess generated enb.cfg with CPP on its own. While CPP works ok for simple 1RU-1CELL cases, and CPP is also the tool that Amarisoft itself uses in its examples, it has the limitation that it cannot cooperate with loops. In other words there can be only one global N_RB_DL #define, and it cannot be different for different cells while we are looping over them at Jinja2 level. That means that we cannot use CPP to handle multiple cells. For this reason switch enb.jinja2.cfg to be using Jinja2 only without CPP. While rendered enb.cfg/gnb.cfg change, we can see that they change in expected way, with leaving only blocks that should be active for input parameters. See the Appendix for details. The switch is straightforward but one thing deserves to be mentioned: due to limitation of Jinja2, where macros can return only strings, we use JSON encoding to be able to return arbitrary types - integers, floats, dicts, etc, and use a convention to name such macros with j prefix and wrap their usage with J so that whole invocation does not add much noise. See added slaplte.J documentation for details. /cc @lu.xu, @tomo, @xavier_thompson, @Daetalus /reviewed-by @jhuge /reviewed-on nexedi/slapos!1520 -------- Appendix. Diff for rendered enb.cfg/gnb.cfg before and after this patch ``` $ git diff --no-index config/{old,out} ``` ```diff diff --git a/config/old/enb.cfg b/config/out/enb.cfg index 23e56c9a9..ee2661640 100644 --- a/config/old/enb.cfg +++ b/config/out/enb.cfg @@ -1,14 +1,6 @@ -#define TDD 1 - -#define N_RB_DL 50 - -#define N_ANTENNA_DL 2 - -#define N_ANTENNA_UL 2 - { @@ -44,8 +36,8 @@ cell_list: [ { rf_port: 0, - n_antenna_dl: N_ANTENNA_DL, - n_antenna_ul: N_ANTENNA_UL, + n_antenna_dl: 2, + n_antenna_ul: 2, cell_id: 0x00, tac: 0x0001, @@ -59,83 +51,33 @@ manual_ref_signal_power: true, - -#if TDD == 1 uldl_config: 6, sp_config: 7, -#endif - - n_rb_dl: N_RB_DL, -#if N_RB_DL == 6 - si_coderate: 0.30, -#else - si_coderate: 0.20, -#endif + n_rb_dl: 50, + si_coderate: 0.2, pdsch_dedicated: { -#if N_ANTENNA_DL == 4 - p_a: -6, -#elif N_ANTENNA_DL == 2 p_a: -3, -#else - p_a: 0, -#endif p_b: -1, }, -#if N_RB_DL == 6 - pdcch_format: 1, -#else - pdcch_format: 2, -#endif - -#if N_RB_DL == 6 - prach_config_index: 15, -#else + pdcch_format: 2, prach_config_index: 4, -#endif - -#if N_RB_DL == 6 - initial_cqi: 5, -#else - initial_cqi: 3, -#endif + initial_cqi: 3, pucch_dedicated: { n1_pucch_sr_count: 11, cqi_pucch_n_rb: 1, n1_pucch_an_cs_count: 8, n3_pucch_an_n_rb: 3, -#if TDD == 1 tdd_ack_nack_feedback_mode: "multiplexing", /* TDD only */ -#endif }, - -#if N_ANTENNA_DL >= 2 m_ri: 8, transmission_mode: 3, -#endif srs_dedicated: { -#if N_RB_DL == 6 - srs_bandwidth_config: 7, - srs_bandwidth: 1, -#elif N_RB_DL == 15 - srs_bandwidth_config: 6, - srs_bandwidth: 1, -#elif N_RB_DL == 25 - srs_bandwidth_config: 3, - srs_bandwidth: 1, -#elif N_RB_DL == 50 srs_bandwidth_config: 2, srs_bandwidth: 2, -#elif N_RB_DL == 75 - srs_bandwidth_config: 2, - srs_bandwidth: 2, -#else - srs_bandwidth_config: 2, - srs_bandwidth: 3, -#endif srs_subframe_config: 3, srs_period: 40, srs_hopping_bandwidth: 0, diff --git a/config/old/gnb.cfg b/config/out/gnb.cfg index 5bfd3bb01..0b6a1445c 100644 --- a/config/old/gnb.cfg +++ b/config/out/gnb.cfg @@ -1,13 +1,6 @@ -#define TDD 1 - - -#define N_ANTENNA_DL 2 - -#define N_ANTENNA_UL 2 - { @@ -50,8 +43,8 @@ nr_cell_list: [ { rf_port: 0, - n_antenna_dl: N_ANTENNA_DL, - n_antenna_ul: N_ANTENNA_UL, + n_antenna_dl: 2, + n_antenna_ul: 2, cell_id: 0x01, n_id_cell: 500, @@ -108,29 +101,10 @@ csi_rs: { nzp_csi_rs_resource: [ { -#if N_ANTENNA_DL == 1 - n_ports: 1, - frequency_domain_allocation: "row2", - bitmap: "100000000000", - cdm_type: "no_cdm", -#elif N_ANTENNA_DL == 2 n_ports: 2, frequency_domain_allocation: "other", bitmap: "100000", cdm_type: "fd_cdm2", -#elif N_ANTENNA_DL == 4 - n_ports: 4, - frequency_domain_allocation: "row4", - bitmap: "100", - cdm_type: "fd_cdm2", -#elif N_ANTENNA_DL == 8 - n_ports: 8, - frequency_domain_allocation: "other", - bitmap: "110011", - cdm_type: "fd_cdm2", -#else -#error unsupported number of DL antennas -#endif }, ], @@ -148,22 +122,10 @@ csi_report_config: [ { -#if N_ANTENNA_DL > 1 codebook_config: { codebook_type: "type1", sub_type: "typeI_SinglePanel", -#if N_ANTENNA_DL == 2 -#elif N_ANTENNA_DL == 4 - n1: 2, - n2: 1, - codebook_mode: 1, -#elif N_ANTENNA_DL == 8 - n1: 4, - n2: 1, - codebook_mode: 1, -#endif }, -#endif }, ], }, ```