mirror of
https://github.com/Telecominfraproject/oopt-gnpy.git
synced 2025-11-02 02:57:52 +00:00
The penalties are calculated and presented separately from the GSNR.
They are also taken into account when optimizing trx mode and verifying
path feasibility in path_requests_run processing.
Penalties are specified in the eqpt_config file as part of trx modes.
This patch includes specifications for OpenROADM trx modes.
Penalties are defined by a list of
impairment_value/penalty_value pairs, for example:
"penalties": [
{
"chromatic_dispersion": 4e3,
"penalty_value": 0
},
{
"chromatic_dispersion": 18e3,
"penalty_value": 0.5
},
{
"pmd": 10,
"penalty_value": 0
},
{
"pmd": 30,
"penalty_value": 0.5
}
]
- Between given pairs, penalty is linearly interpolated.
- Below min and above max up_to_boundary, transmission is considered
not feasible.
This is in line with how penalties are specified in OpenROADM and
compatible with specifications from most other organizations and
vendors.
The implementation makes it easy to add other penalties (PDL, etc.) in
the future.
The input format is flexible such that it can easily be extended to
accept combined penalty entries (e.g. CD and PMD) in the future.
Signed-off-by: Jonas Mårtensson <jonas.martensson@ri.se>
Change-Id: I3745eba48ca60c0e4c904839a99b59104eae9216
76 lines
3.5 KiB
Python
76 lines
3.5 KiB
Python
#!/usr/bin/env python3
|
|
# -*- coding: utf-8 -*-
|
|
|
|
'''
|
|
gnpy.core.equipment
|
|
===================
|
|
|
|
This module contains functionality for specifying equipment.
|
|
'''
|
|
|
|
from gnpy.core.utils import automatic_nch, db2lin
|
|
from gnpy.core.exceptions import EquipmentConfigError
|
|
|
|
|
|
def trx_mode_params(equipment, trx_type_variety='', trx_mode='', error_message=False):
|
|
"""return the trx and SI parameters from eqpt_config for a given type_variety and mode (ie format)"""
|
|
trx_params = {}
|
|
default_si_data = equipment['SI']['default']
|
|
|
|
try:
|
|
trxs = equipment['Transceiver']
|
|
# if called from path_requests_run.py, trx_mode is filled with None when not specified by user
|
|
# if called from transmission_main.py, trx_mode is ''
|
|
if trx_mode is not None:
|
|
mode_params = next(mode for trx in trxs
|
|
if trx == trx_type_variety
|
|
for mode in trxs[trx].mode
|
|
if mode['format'] == trx_mode)
|
|
trx_params = {**mode_params}
|
|
# sanity check: spacing baudrate must be smaller than min spacing
|
|
if trx_params['baud_rate'] > trx_params['min_spacing']:
|
|
raise EquipmentConfigError(f'Inconsistency in equipment library:\n Transpoder "{trx_type_variety}" mode "{trx_params["format"]}" ' +
|
|
f'has baud rate {trx_params["baud_rate"]*1e-9} GHz greater than min_spacing {trx_params["min_spacing"]*1e-9}.')
|
|
else:
|
|
mode_params = {"format": "undetermined",
|
|
"baud_rate": None,
|
|
"OSNR": None,
|
|
"penalties": None,
|
|
"bit_rate": None,
|
|
"roll_off": None,
|
|
"tx_osnr": None,
|
|
"min_spacing": None,
|
|
"cost": None}
|
|
trx_params = {**mode_params}
|
|
trx_params['f_min'] = equipment['Transceiver'][trx_type_variety].frequency['min']
|
|
trx_params['f_max'] = equipment['Transceiver'][trx_type_variety].frequency['max']
|
|
|
|
# TODO: novel automatic feature maybe unwanted if spacing is specified
|
|
# trx_params['spacing'] = _automatic_spacing(trx_params['baud_rate'])
|
|
# temp = trx_params['spacing']
|
|
# print(f'spacing {temp}')
|
|
except StopIteration:
|
|
if error_message:
|
|
raise EquipmentConfigError(f'Could not find transponder "{trx_type_variety}" with mode "{trx_mode}" in equipment library')
|
|
else:
|
|
# default transponder charcteristics
|
|
# mainly used with transmission_main_example.py
|
|
trx_params['f_min'] = default_si_data.f_min
|
|
trx_params['f_max'] = default_si_data.f_max
|
|
trx_params['baud_rate'] = default_si_data.baud_rate
|
|
trx_params['spacing'] = default_si_data.spacing
|
|
trx_params['OSNR'] = None
|
|
trx_params['penalties'] = {}
|
|
trx_params['bit_rate'] = None
|
|
trx_params['cost'] = None
|
|
trx_params['roll_off'] = default_si_data.roll_off
|
|
trx_params['tx_osnr'] = default_si_data.tx_osnr
|
|
trx_params['min_spacing'] = None
|
|
nch = automatic_nch(trx_params['f_min'], trx_params['f_max'], trx_params['spacing'])
|
|
trx_params['nb_channel'] = nch
|
|
print(f'There are {nch} channels propagating')
|
|
|
|
trx_params['power'] = db2lin(default_si_data.power_dbm) * 1e-3
|
|
|
|
return trx_params
|