{#- XXX ORS -> provide defaults for: slave_instance_list #}
{#- XXX icell vs cell / iru vs ru everyhere + document it #}
{#- XXX TDD check   #}

{%- import 'slaplte.jinja2' as slaplte  with context %}
{%- set J               = slaplte.J %}
{%- set jcell_ru_ref    = slaplte.jcell_ru_ref %}
{%- set cfg             = slaplte.cfg %}

{#- for standalone testing via slapos-render-config.py
    NOTE: keep in sync with instance-enb.jinja2.cfg and ru/libinstance.jinja2.cfg   #}
{%- if _standalone is defined                                                 %}
{%-   set iru_dict   = {}                                                     %}
{%-   set icell_dict = {}                                                     %}
{%-   set ipeercell_dict = {}                                                 %}
{%-   do slaplte.load_iru_and_icell(iru_dict, icell_dict, icell_kind='enb')   %}
{%-   do slaplte.load_ipeercell(ipeercell_dict)                               %}
{%-   do slaplte.check_loaded_everything()                                    %}
{%- endif                                                                     %}

{#- do_lte/do_nr indicate whether we have LTE and/or NR cells #}
{%- set do_lte = len(list(icell_dict|dictsort | selectattr('1._.cell_type', '==', 'lte'))) > 0 %}
{%- set do_nr  = len(list(icell_dict|dictsort | selectattr('1._.cell_type', '==', 'nr')))  > 0 %}


{#- cell_tdd_config returns tdd_config for LTE cell. #}
{%- macro cell_tdd_config(cell) %}
{%-   set _ = {'[Configuration 2] 5ms 2UL 6DL (default)':        2,
               '[Configuration 6] 5ms 5UL 3DL (maximum uplink)': 6} %}
{{-   _[cell.tdd_ul_dl_config] }}
{%- endmacro -%}

{#- nr_cell_tdd_config returns tdd_config for NR cell. #}
{%- macro nr_cell_tdd_config(cell) %}
{%-   set _ = {'5ms 2UL 7DL 4/6 (default)':         1,
               '2.5ms 1UL 3DL 2/10':                2,
               '5ms 8UL 1DL 2/10 (maximum uplink)': 3}  %}
{{-   _[cell.tdd_ul_dl_config] }}
{%- endmacro -%}

{#- handover_config emits handover configuration for specified cell #}
{%- macro handover_config(cell_ref)  %}
          ncell_list: [
            // Intra-ENB HO
{%-       for cell2_ref, icell2 in icell_dict|dictsort %}
{%-         set cell2 = icell2['_']                   %}
{%-         if cell2_ref != cell_ref %} {#- NOTE: HO to both LTE and NR #}
            {
{%-           if cell2.cell_type == 'lte' %}
              rat:        "eutra",
              cell_id:    {{ cfg('enb_id') }}{{ cell2.cell_id.removeprefix('0x') }}, // -> {{ cell2_ref }}
              n_id_cell:  {{ cell2.pci }},
              dl_earfcn:  {{ cell2.dl_earfcn }},
              tac:        {{ cell2.tac }},
{%-           elif cell2.cell_type == 'nr' %}
              rat:        "nr",
              cell_id:    {{ cell2.cell_id }},  // -> {{ cell2_ref }}
{%-           else  %}
{%-             do bug('unreachable')   %}
{%-           endif %}
            },
{%-         endif %}
{%-       endfor %}

            // Inter-ENB HO
{#- TODO: add info about peers as shared instances - one instance per peer *ENB*.
          then query SlapOS Master about cells configured on that peer ENB and
          put them as peers here #}
{%-       for peercell_ref, ipeercell in ipeercell_dict|dictsort %}
{%-         set ncell = ipeercell['_']  %}
            {
{%-           if ncell.peer_cell_type == 'lte' %}
              rat:          "eutra",
              cell_id:      {{ ncell.e_cell_id }},  // -> {{ peercell_ref }}
              n_id_cell:    {{ ncell.pci }},
              dl_earfcn:    {{ ncell.dl_earfcn }},
              tac:          {{ ncell.tac }},
{%-           elif ncell.peer_cell_type == 'nr' %}
              rat:          "nr",
              nr_cell_id:   {{ ncell.nr_cell_id }}, // -> {{ peercell_ref }}
              gnb_id_bits:  {{ ncell.gnb_id_bits }},
              n_id_cell:    {{ ncell.pci }},
              dl_nr_arfcn:  {{ ncell.dl_nr_arfcn }},
              ssb_nr_arfcn: {{ ncell.ssb_nr_arfcn }},
              ul_nr_arfcn:  {{ ncell.ul_nr_arfcn }},
              tac:          {{ ncell.tac }},
              band:         {{ ncell.nr_band }},
              ssb_subcarrier_spacing: 30,
              ssb_period: 20,
              ssb_offset: 0,
              ssb_duration: 1,
{%-           else  %}
{%-             do bug('unreachable')   %}
{%-           endif %}
            },
{%-       endfor %}

          ],
{%- endmacro %}


{#- start of the config -#}
{
  log_options: "all.level=error,all.max_size=0,nas.level=debug,nas.max_size=1,s1ap.level=debug,s1ap.max_size=1,x2ap.level=debug,x2ap.max_size=1,rrc.level=debug,rrc.max_size=1,ngap.level=debug,ngap.max_size=1,xnap.level=debug,xnap.max_size=1,
{%- if slapparameter_dict.get('log_phy_debug', False) -%}
    phy.level=debug
{%- else -%}
    phy.level=info
{%- endif -%}
    ,file.rotate=1G,file.path=/dev/null",
  log_filename: "{{ directory['log'] }}/enb.log",

{# instantiate radio units #}
{{ slaplte.ru_config(iru_dict, slapparameter_dict) }}

  {%- if slapparameter_dict.get('websocket_password', '') %}
  com_addr: "[{{ gtp_addr_v6 }}]:{{ slap_configuration['configuration.com_ws_port'] }}",
  com_auth: {
    password: "{{ slapparameter_dict['websocket_password'] }}",
  },
  {%- else %}
  com_addr: "{{ slap_configuration['configuration.com_addr'] }}:{{ slap_configuration['configuration.com_ws_port'] }}",
  {%- endif %}

{%  if do_lte %}
  // LTE core network + XXX X2 peers
  mme_list: [
{%-   for _, mme in slapparameter_dict.get('mme_list',
                        {'1':{'mme_addr': slap_configuration['configuration.mme_addr']}})
                        | dictsort %}
    {
      mme_addr: "{{ mme['mme_addr'] }}",
    },
{%-   endfor %}
  ],
{%- endif %}

{%  if do_nr %}
  // NR core network + XXX Xn pers
  afm_list: [
{%-   for _, afm in slapparameter_dict.get('afm_list',
                        {'1':{'afm_addr': slap_configuration['configuration.amf_addr']}})
                        | dictsort %}
    {
      afm_addr: "{{ afm['afm_addr'] }}",
    },
{%-   endfor %}
  ],
{%- endif %}

{#- X2/Xn TODO:  add info about peers as shared instances - one instance per peer *ENB*.
          then query SlapOS Master about cells configured on that peer ENB and
          depending on whether LTE and/or NR cells are there add X2 and/or Xn peers #}
{# XXX move ^^^ ? #}
{% if slapparameter_dict.get('xn_peers', '') %}
  xn_peers: [
{%- for k in slapparameter_dict['xn_peers'] -%}
    "{{ slapparameter_dict['xn_peers'][k]['xn_addr'] }}",
{%- endfor -%}
  ],
{% endif %}

{% if slapparameter_dict.get('mme_list', '')  or  slapparameter_dict.get('afm_list', '') %}
{%   if slapparameter_dict.get('use_ipv4', False) %}
  gtp_addr: "{{ gtp_addr_v4 }}",
{%   else %}
  gtp_addr: "{{ gtp_addr_v6 }}",
{%   endif %}
{% else %}
  gtp_addr: "{{ slap_configuration['configuration.gtp_addr'] }}",
{% endif %}

{%- if do_lte %}
  enb_id: {{ cfg('enb_id') }},
{%- endif %}
{%- if do_nr %}
  gnb_id: {{ cfg('gnb_id') }},
  gnb_id_bits: {{ cfg('gnb_id_bits') }},
  en_dc_support: true,
{%- endif %}

  // LTE cells
  cell_list: [
{%- for i, (cell_ref, icell) in enumerate(icell_dict|dictsort) %}
{%-   set cell = icell['_']                               %}
{%-   if cell.cell_type == 'lte'                          %}
{%-     set ru_ref = J(jcell_ru_ref(icell, icell_dict))   %}
{%-     set iru = iru_dict[ru_ref]                        %}
{%-     set ru = iru['_']                                 %}

        // {{ cell_ref }}  ({{ ru_ref }})
        {
          rf_port:      {{ ru._rf_port }},
          n_antenna_dl: {{ ru.n_antenna_dl }},
          n_antenna_ul: {{ ru.n_antenna_ul }},

          cell_id:      {{ cell.cell_id }},
          tac:          {{ cell.tac }},
          n_id_cell:    {{ cell.pci }},
          dl_earfcn:    {{ cell.dl_earfcn }},
          ul_earfcn:    {{ cell.ul_earfcn }},
          root_sequence_index: {{ cell.get('root_sequence_index',
                                    slapparameter_dict.get('root_sequence_index',
                                      204 + i)) }},

          // Handover
{{- handover_config(cell_ref) }}

          // Carrier Aggregation: LTE + LTE
          scell_list: [
{%-       for cell2_ref, icell2 in icell_dict|dictsort %}
{%-         set cell2 = icell2['_']                   %}
{%-         if cell2_ref != cell_ref  and  cell2.cell_type == 'lte' %}
            {
              cell_id: {{ cell2.cell_id }},  // + {{ cell2_ref }}
              cross_carrier_scheduling: false,
            },
{%-         endif %}
{%-       endfor %}
          ],

{%-       if do_nr  %}
          // Carrier Aggregation: LTE + NR
          en_dc_scg_cell_list: [
{%-         for cell2_ref, icell2 in icell_dict|dictsort %}
{%-           set cell2 = icell2['_']                   %}
{%-           if cell2_ref != cell_ref  and  cell2.cell_type == 'nr' %}
              {
                cell_id: {{ cell2.cell_id }}, // + {{ cell2_ref }}
              },
{%-           endif %}
{%-         endfor  %}
          ],
{%-       endif %}


          // tune LTE parameters for the cell
{%-       set tdd = (cell.rf_mode == 'tdd') %}
{%-       if tdd %}
          uldl_config: {{ cell_tdd_config(cell) }},
          sp_config: 7,
{%-       endif %}

{%-       set n_rb_dl = {'1.4 MHz':  6,
                         '3 MHz':   15,
                         '5 MHz':   25,
                         '10 MHz':  50,
                         '15 MHz':  75,
                         '20 MHz': 100} [cell.bandwidth]  %}
          n_rb_dl: {{ n_rb_dl }},
          si_coderate: {{ 0.30  if n_rb_dl == 6  else 0.20 }},

          pdsch_dedicated: {
            p_a: {{ {4: -6, 2: -3}.get(ru.n_antenna_dl, 0) }},
            p_b: -1,
          },

          pdcch_format:       {{  1  if n_rb_dl == 6  else 2 }},
          prach_config_index: {{ 15  if n_rb_dl == 6  else 4 }},
          initial_cqi:        {{  5  if n_rb_dl == 6  else 3 }},

          pucch_dedicated: {
            n1_pucch_sr_count: 11,
            cqi_pucch_n_rb: 1,
            n1_pucch_an_cs_count: 8,  {# XXX else "n1_pucch_an_cs_count must be > 0 for the CA Primary cell" #}
            n3_pucch_an_n_rb: 3,      {# XXX else "n3_pucch_an_n_rb must be > 0 for the CA Primary cell" #}
{%-         if tdd  %}
            tdd_ack_nack_feedback_mode: "multiplexing", /* TDD only */
{%-         endif %}
          },

{%-       if ru.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,
          },

{#- XXX do we want to differentiate whether it is ORS or Amarisoft SDR board ? #}
{%-       if ru.ru_type == 'sdr'   %}
          manual_ref_signal_power: true,
{%-       endif %}

          drb_config: "{{ cell_ref }}-drb.cfg",

          sib_sched_list: [
            {
              filename: "{{ cell_ref }}-sib23.asn",
              si_periodicity: 16,
            },
          ],
        },
{%-   endif %}
{%- endfor %}
  ],

  cell_default: {
    plmn_list: [
{%- if slapparameter_dict.get('plmn_list', '') %}
{%- for i, k in enumerate(slapparameter_dict['plmn_list']) %}
{%- if i == 0 -%}
      {
{%- else -%}
      , {
{%- endif %}
      plmn: "{{ slapparameter_dict['plmn_list'][k]['plmn'] }}",
      reserved: {{ str(slapparameter_dict['plmn_list'][k].get('reserved', false)).lower() }},
      attach_without_pdn: {{ str(slapparameter_dict['plmn_list'][k].get('attach_without_pdn', false)).lower() }},
      }
{%- endfor -%}
{% else %}
      "00101",
{% endif %}
    ],
    cyclic_prefix: "normal",

    phich_duration: "normal",
    phich_resource: "1",

    si_value_tag: 0,
    cell_barred: false,
    intra_freq_reselection: true,
    q_rx_lev_min: -70,
    si_window_length: 40,

    si_pdcch_format: 2,

    n_symb_cch: 0,

    prach_freq_offset: -1,

    pusch_dedicated: {
      beta_offset_ack_index: 9,
      beta_offset_ri_index: 6,
      beta_offset_cqi_index: 6,
    },

    pusch_hopping_offset: -1,

    pusch_msg3_mcs: 0,


    dl_256qam: true,
    ul_64qam: true,

    sr_period: 20,

    cqi_period: 40,


    mac_config: {
       ul_max_harq_tx: 5,
       dl_max_harq_tx: 5,
    },

    pusch_max_its: 6,

    dpc: true,
    dpc_pusch_snr_target: 25,
    dpc_pucch_snr_target: 25,

    cipher_algo_pref: [],
    integ_algo_pref: [2, 1],

    // XXX -> cell ?
    inactivity_timer: {{ slapparameter_dict.get('inactivity_timer', slap_configuration['configuration.default_lte_inactivity_timer']) }},

    srb_config: [
      {
        id: 1,
        maxRetxThreshold: 32,
        t_Reordering: 45,
        t_PollRetransmit: 60,
      },
      {
        id: 2 ,
        maxRetxThreshold: 32,
        t_Reordering: 45,
        t_PollRetransmit: 60,
      }
    ],

  meas_config_desc: {
    a1_report_type: "rsrp",
    a1_rsrp: -70,
    a1_hysteresis: 0,
    a1_time_to_trigger: 640,
    a2_report_type: "rsrp",
    a2_rsrp: -80,
    a2_hysteresis: 0,
    a2_time_to_trigger: 640,
    a3_report_type: "rsrp",
    a3_offset: {{ slapparameter_dict.get('lte_handover_a3_offset', 6) }},
    a3_hysteresis: 0,
    a3_time_to_trigger: {{ slapparameter_dict.get('lte_handover_a3_time_to_trigger', 480) }},
  },
  meas_gap_config: "gp0",
  ho_from_meas: true,
  },

  // NR cells
  nr_cell_list: [
{%- for i, (cell_ref, icell) in enumerate(icell_dict|dictsort) %}
{%-   set cell = icell['_']                               %}
{%-   if cell.cell_type == 'nr'                           %}
{%-     set ru_ref = J(jcell_ru_ref(icell, icell_dict))   %}
{%-     set iru = iru_dict[ru_ref]                        %}
{%-     set ru = iru['_']                                 %}

        // {{ cell_ref }}  ({{ ru_ref }})
        {
          rf_port:      {{ ru._rf_port }},
          n_antenna_dl: {{ ru.n_antenna_dl }},
          n_antenna_ul: {{ ru.n_antenna_ul }},

          cell_id:      {{ cell.cell_id }},
          n_id_cell:    {{ cell.pci }},
          band:         {{ cell.nr_band }},
          dl_nr_arfcn:  {{ cell.dl_nr_arfcn }},
          ul_nr_arfcn:  {{ cell.ul_nr_arfcn }},
          bandwidth:    {{ cell.bandwidth }},

          subcarrier_spacing: {{ 30  if cell.rf_mode == 'tdd'  else 15 }},
          ssb_nr_arfcn:   {{ cell.ssb_nr_arfcn }},
          ssb_pos_bitmap: {{ cell.ssb_pos_bitmap }},

          root_sequence_index: 1,   // XXX adjust from cfg('root_sequence_index') XXX place


          // Handover
{{- handover_config(cell_ref) }}

          // Carrier Aggregation: NR + NR
          scell_list: [
{%-       for cell2_ref, icell2 in icell_dict|dictsort %}
{%-         set cell2 = icell2['_']                   %}
{%-         if cell2_ref != cell_ref  and  cell2.cell_type == 'nr' %}
            {
              cell_id: {{ cell2.cell_id }},  // + {{ cell2_ref }}
            },
{%-         endif %}
{%-       endfor %}
          ],

{%-       if do_lte %}
          // Carrier Aggregation: NR + LTE
          nr_dc_scg_cell_list: [
{%-           for cell2_ref, icell2 in icell_dict|dictsort %}
{%-             set cell2 = icell2['_']                   %}
{%-             if cell2_ref != cell_ref  and  cell2.cell_type == 'lte' %}
                {
                  cell_id: {{ cell2.cell_id }}, // + {{ cell2_ref }}
                },
{%-             endif %}
{%-           endfor %}
          ],
{%-       endif %}

        // tune NR parameters for the cell  XXX -> sdr/ors ? (see lte ^^^)
        {%- if slapparameter_dict.get('rrh', 'ORS') == "ORS" %}
            manual_ref_signal_power: true,
        {%- if 'XXX_one_watt' == "True" %}
            ss_pbch_block_power: {{ ru.tx_gain - 54 }},
        {%- else %}
            ss_pbch_block_power: {{ ru.tx_gain - 35 }},
        {%- endif -%}
        {%- endif %}

{%-       set tdd = (cell.rf_mode == 'tdd') %}
{%-       set tdd_config = nr_cell_tdd_config(cell) if tdd else None %},

{%        if tdd_config == 1 %}
           tdd_ul_dl_config: {
             pattern1: {
               period: 5,
               dl_slots: 7,
               dl_symbols: 6,
               ul_slots: 2,
               ul_symbols: 4,
             },
           },
{%        elif tdd_config == 2 %}
           tdd_ul_dl_config: {
             pattern1: {
               period: 2.5,
               dl_slots: 3,
               dl_symbols: 10,
               ul_slots: 1,
               ul_symbols: 2,
             },
           },
{%        elif tdd_config == 3 %}
           tdd_ul_dl_config: {
             pattern1: {
                period: 5, /* in ms */
                dl_slots: 1,
                dl_symbols: 10,
                ul_slots: 8,
                ul_symbols: 2,
             },
           },
{%        endif %}

        },

{%-   endif %}
{%- endfor %}
  ],

{# XXX restore
  nr_cell_default: {
    ssb_period: 20,

    plmn_list: [
{%- if slapparameter_dict.get('plmn_list', '') %}
{%- for i, k in enumerate(slapparameter_dict['plmn_list']) %}
{%- if i == 0 -%}
      {
{%- else -%}
      , {
{%- endif %}
      plmn: "{{ slapparameter_dict['plmn_list'][k]['plmn'] }}",
      tac: {{ slapparameter_dict['plmn_list'][k].get('tac', 100) }},
{%- if slapparameter_dict['plmn_list'][k].get('ranac', '') %}
      ranac: {{ slapparameter_dict['plmn_list'][k]['ranac'] }},
{%- endif %}
      reserved: {{ str(slapparameter_dict['plmn_list'][k].get('reserved', false)).lower() }},
      nssai: [
{%- if slapparameter_dict.get('nssai', '') %}
{%- for j, k in enumerate(slapparameter_dict['nssai']) %}
{%- if j == 0 %}
        {
{%- else -%}
        , {
{%- endif %}
         sst: {{ slapparameter_dict['nssai'][k]['sst'] }},
{%- if slapparameter_dict['nssai'][k].get('sd', '') %}
         sd: {{ slapparameter_dict['nssai'][k]['sd'] }},
{%- endif %}
        }
{%- endfor -%}
{% else %}
        {
         sst: 1,
        },
{% endif %}
      ],
      }
{%- endfor -%}
{% else %}
      {
      plmn: "00101",
      tac: 100,
      reserved: false,
      nssai: [
{%- if slapparameter_dict.get('nssai', '') %}
{%- for j, k in enumerate(slapparameter_dict['nssai']) %}
{%- if j == 0 %}
        {
{%- else -%}
        , {
{%- endif %}
         sst: {{ slapparameter_dict['nssai'][k]['sst'] }},
{%- if slapparameter_dict['nssai'][k].get('sd', '') %}
         sd: {{ slapparameter_dict['nssai'][k]['sd'] }},
{%- endif %}
        }
{%- endfor -%}
{% else %}
        {
         sst: 1,
        },
{% endif %}
       ],
      },
{%- endif %}
    ],

    si_window_length: 40,
    cell_barred: false,
    intra_freq_reselection: true,
    q_rx_lev_min: -70,
    q_qual_min: -20,

    sr_period: 40,
    dmrs_type_a_pos: 2,
    prach: {
      prach_config_index: 160,      // XXX TDD only & TDD_CONFIG != 4
      msg1_subcarrier_spacing: 30,
      msg1_fdm: 1,
{% if ru.ru_type == 'sunwave' %}
      msg1_frequency_start: 0,
{% else %}
      msg1_frequency_start: -1,
{% endif %}
      zero_correlation_zone_config: 15,
      preamble_received_target_power: -110,
      preamble_trans_max: 7,
      power_ramping_step: 4,
      ra_response_window: {{ 20 if tdd else 10 }},
      restricted_set_config: "unrestricted_set",
      ra_contention_resolution_timer: 64,
      ssb_per_prach_occasion: 1,
      cb_preambles_per_ssb: 8,
    },
    pdcch: {
{% if ru.ru_type == 'sunwave' %}
      n_rb_coreset0: 48,
      n_symb_coreset0: 1,
{% endif %}
      search_space0_index: 0,
      dedicated_coreset: {
        rb_start: -1,
        l_crb: -1,
{% if ru.ru_type == 'sunwave' %}
        duration: 1,
{% else %}
        duration: 0,
{% endif %}
        precoder_granularity: "sameAsREG_bundle",
      },
      css: {
        n_candidates: [ 0, 0, 4, 0, 0 ],
      },
      rar_al_index: 2,
      si_al_index: 2,
{% if tdd_config == 3 %}
      uss: {
       n_candidates: [ 0, 8, 1, 0, 0 ],
       dci_0_1_and_1_1: true,
      },
{% else %}
      uss: {
        n_candidates: [ 0, 2, 1, 0, 0 ],
        dci_0_1_and_1_1: true,
      },
{% endif %}
      al_index: 1,
    },
    pdsch: {
      mapping_type: "typeA",
      dmrs_add_pos: 1,
      dmrs_type: 1,
      dmrs_max_len: 1,
{% if ru.ru_type == 'sunwave' %}
      k0: 0,
      k1: [ 8, 7, 7, 6, 5, 4, 12, 11 ],
{% elif tdd_config == 3 %}
      k1: [4, 11],
{% endif %}
      mcs_table: "qam256",
      rar_mcs: 2,
      si_mcs: 6,
    },
    csi_rs: {
      nzp_csi_rs_resource: [
        {
          csi_rs_id: 0,
{%- if ru.n_antenna_dl == 1     %}
          n_ports: 1,
          frequency_domain_allocation: "row2",
          bitmap: "100000000000",
          cdm_type: "no_cdm",
{%- elif ru.n_antenna_dl == 2   %}
          n_ports: 2,
          frequency_domain_allocation: "other",
          bitmap: "100000",
          cdm_type: "fd_cdm2",
{%- elif ru.n_antenna_dl == 4   %}
          n_ports: 4,
          frequency_domain_allocation: "row4",
          bitmap: "100",
          cdm_type: "fd_cdm2",
{%- elif ru.n_antenna_dl == 8   %}
          n_ports: 8,
          frequency_domain_allocation: "other",
          bitmap: "110011",
          cdm_type: "fd_cdm2",
{%- else  %}
{%-  do error(icell, "unsupported number of DL antennas")   %}
{%- endif %}
          density: 1,
          first_symb: 4,
          rb_start: 0,
          l_crb: -1,
          power_control_offset: 0,
          power_control_offset_ss: 0,
          period: 80,
          offset: 1,
          qcl_info_periodic_csi_rs: 0,
        },
{% if tdd_config != 3 %}
        {
          csi_rs_id: 1,
          n_ports: 1,
          frequency_domain_allocation: "row1",
          bitmap: "0001",
          cdm_type: "no_cdm",
          density: 3,
          first_symb: 4,
          rb_start: 0,
          l_crb: -1,
          power_control_offset: 0,
          power_control_offset_ss: 0,
          period: 40,
          offset: 11,
          qcl_info_periodic_csi_rs: 0,
        },
        {
          csi_rs_id: 2,
          n_ports: 1,
          frequency_domain_allocation: "row1",
          bitmap: "0001",
          cdm_type: "no_cdm",
          density: 3,
          first_symb: 8,
          rb_start: 0,
          l_crb: -1,
          power_control_offset: 0,
          power_control_offset_ss: 0,
          period: 40,
          offset: 11,
          qcl_info_periodic_csi_rs: 0,
        },
        {
          csi_rs_id: 3,
          n_ports: 1,
          frequency_domain_allocation: "row1",
          bitmap: "0001",
          cdm_type: "no_cdm",
          density: 3,
          first_symb: 4,
          rb_start: 0,
          l_crb: -1,
          power_control_offset: 0,
          power_control_offset_ss: 0,
          period: 40,
          offset: 12,
          qcl_info_periodic_csi_rs: 0,
        },
        {
          csi_rs_id: 4,
          n_ports: 1,
          frequency_domain_allocation: "row1",
          bitmap: "0001",
          cdm_type: "no_cdm",
          density: 3,
          first_symb: 8,
          rb_start: 0,
          l_crb: -1,
          power_control_offset: 0,
          power_control_offset_ss: 0,
          period: 40,
          offset: 12,
          qcl_info_periodic_csi_rs: 0,
        },
{% endif %}
      ],
      nzp_csi_rs_resource_set: [
        {
          csi_rs_set_id: 0,
          nzp_csi_rs_resources: [ 0 ],
          repetition: false,
        },
{% if tdd_config != 3 %}
        {
          csi_rs_set_id: 1,
          nzp_csi_rs_resources: [ 1, 2, 3, 4 ],
          repetition: false,
          trs_info: true,
        },
{% endif %}
      ],
     csi_im_resource: [
        {
          csi_im_id: 0,
          pattern: 1,
          subcarrier_location: 8,
          symbol_location: 8,
          rb_start: 0,
          l_crb: -1,
          period: 80,
          offset: 1,
        },
      ],
      csi_im_resource_set: [
        {
          csi_im_set_id: 0,
          csi_im_resources: [ 0 ],
        }
      ],
      zp_csi_rs_resource: [
        {
          csi_rs_id: 0,
          frequency_domain_allocation: "row4",
          bitmap: "100",
          n_ports: 4,
          cdm_type: "fd_cdm2",
          first_symb: 8,
          density: 1,
          rb_start: 0,
          l_crb: -1,
          period: 80,
          offset: 1,
        },
      ],
      p_zp_csi_rs_resource_set: [
        {
          zp_csi_rs_resources: [ 0 ],
        },
      ],
      csi_resource_config: [
        {
          csi_rsc_config_id: 0,
          nzp_csi_rs_resource_set_list: [ 0 ],
          resource_type: "periodic",
        },
        {
          csi_rsc_config_id: 1,
          csi_im_resource_set_list: [ 0 ],
          resource_type: "periodic",
        },
{% if tdd_config != 3 %}
        {
          csi_rsc_config_id: 2,
          nzp_csi_rs_resource_set_list: [ 1 ],
          resource_type: "periodic",
        },
{% endif %}
      ],
      csi_report_config: [
        {
          resources_for_channel_measurement: 0,
          csi_im_resources_for_interference: 1,
          report_config_type: "periodic",
          period: 80,
          report_quantity: "CRI_RI_PMI_CQI",
{%- if ru.n_antenna_dl > 1  %}
          codebook_config: {
            codebook_type: "type1",
            sub_type: "typeI_SinglePanel",
{%-   if ru.n_antenna_dl == 2     %}
{%-   elif ru.n_antenna_dl == 4   %}
            n1: 2,
            n2: 1,
            codebook_mode: 1,
{%-   elif ru.n_antenna_dl == 8   %}
            n1: 4,
            n2: 1,
            codebook_mode: 1,
{%-   endif                       %}
          },
{%- endif   %}
          cqi_table: 2,
          subband_size: "value1",
        },
      ],
    },
    pucch: {
      dpc_snr_target: 25,
      pucch_group_hopping: "neither",
      hopping_id: -1,
      p0_nominal: -90,
        pucch1: {
          n_cs: 3,
          n_occ: 3,
          freq_hopping: true,
        },
        pucch2: {
          n_symb: 2,
          n_prb: 1,
          freq_hopping: true,
          simultaneous_harq_ack_csi: false,
          max_code_rate: 0.25,
        },
    },
    pusch: {
      mapping_type: "typeA",
      n_symb: 14,
      dmrs_add_pos: 1,
      dmrs_type: 1,
      dmrs_max_len: 1,
      tf_precoding: false,
      mcs_table: "qam256",
      mcs_table_tp: "qam256",
      ldpc_max_its: 5,
{% if ru.ru_type == 'sunwave' %}
      k2: 4,
      msg3_k2: 7,
{% elif tdd_config == 3 %}
      k2: [11, 12, 4, 5, 6, 7, 7, 8],
      msg3_k2: 7,
{% endif %}
      p0_nominal_with_grant: -84,
      msg3_mcs: 4,
      msg3_delta_power: 0,
      beta_offset_ack_index: 9,
    },
    mac_config: {
      msg3_max_harq_tx: 5,
      ul_max_harq_tx: 5,
      dl_max_harq_tx: 5,
      ul_max_consecutive_retx: 30,
      dl_max_consecutive_retx: 30,
      periodic_bsr_timer: 20,
      retx_bsr_timer: 320,
      periodic_phr_timer: 500,
      prohibit_phr_timer: 200,
      phr_tx_power_factor_change: "dB3",
      sr_prohibit_timer: 0,
      sr_trans_max: 64,
    },
    cipher_algo_pref: [],
    integ_algo_pref: [2, 1],
    inactivity_timer: {{ slapparameter_dict.get('inactivity_timer', slap_configuration['configuration.default_nr_inactivity_timer']) }},

    drb_config: "{{ cell_ref }}-drb.cfg",

    meas_config_desc: {
      a1_report_type: "rsrp",
      a1_rsrp: -60,
      a1_hysteresis: 10,
      a1_time_to_trigger: 100,
      a2_report_type: "rsrp",
      a2_rsrp: -70,
      a2_hysteresis: 0,
      a2_time_to_trigger: 100,
      a3_report_type: "rsrp",
      a3_offset: {{ slapparameter_dict.get('nr_handover_a3_offset', 6) }},
      a3_hysteresis: 0,
      a3_time_to_trigger: {{ slapparameter_dict.get('nr_handover_time_to_trigger', 100) }},
      ssb_rsrq_filter_coeff: 3,
      ssb_sinr_filter_coeff: 5
    },
    meas_gap_config: {
      pattern_id: 0
    },
  },
#}
}