/* ValidateDataDirectionGeneral_Pkg::Subfunctions::getLRBGForRadioMessage */
void getLRBGForRadioMessage_ValidateDataDirectionGeneral_Pkg_Subfunctions(
  /* ValidateDataDirectionGeneral_Pkg::Subfunctions::getLRBGForRadioMessage::inMessage */ ReceivedMessage_T_Common_Types_Pkg *inMessage,
  /* ValidateDataDirectionGeneral_Pkg::Subfunctions::getLRBGForRadioMessage::inPositionedBGs */ positionedBGs_T_TrainPosition_Types_Pck *inPositionedBGs,
  /* ValidateDataDirectionGeneral_Pkg::Subfunctions::getLRBGForRadioMessage::outLRBG */ positionedBG_T_TrainPosition_Types_Pck *outLRBG)
{
  /* ValidateDataDirectionGeneral_Pkg::Subfunctions::getLRBGForRadioMessage */
  static positionedBG_T_TrainPosition_Types_Pck acc;
  static kcg_int i;
  /* ValidateDataDirectionGeneral_Pkg::Subfunctions::getLRBGForRadioMessage::_L10 */
  static NID_BG _L10;
  /* ValidateDataDirectionGeneral_Pkg::Subfunctions::getLRBGForRadioMessage::_L9 */
  static NID_C _L9;
  
  /* 1 */
  Decode_NID_LRBG_TM((*inMessage).Radio_Common_Header.nid_lrbg, &_L9, &_L10);
  kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
    outLRBG,
    (positionedBG_T_TrainPosition_Types_Pck *)
      &cEmptyLRBG_ValidateDataDirection_Pkg);
  for (i = 0; i < 41; i++) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&acc, outLRBG);
    /* 1 */
    getLRBGForRadioMessageIterator_ValidateDataDirectionGeneral_Pkg_Subfunctions(
      &acc,
      _L9,
      _L10,
      &(*inPositionedBGs)[i],
      outLRBG);
  }
}
/* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBG_atIndex_itr */
void deleteBG_atIndex_itr_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBG_atIndex_itr::iteratorIndex */ kcg_int iteratorIndex,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBG_atIndex_itr::indexOfBG */ kcg_int indexOfBG,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBG_atIndex_itr::BG_in */ positionedBG_T_TrainPosition_Types_Pck *BG_in,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBG_atIndex_itr::BG_shifted_in */ positionedBG_T_TrainPosition_Types_Pck *BG_shifted_in,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBG_atIndex_itr::cont */ kcg_bool *cont,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBG_atIndex_itr::BG_out */ positionedBG_T_TrainPosition_Types_Pck *BG_out)
{
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBG_atIndex_itr::IfBlock1::else */
  static kcg_bool else_clock_IfBlock1;
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBG_atIndex_itr::IfBlock1 */
  static kcg_bool IfBlock1_clock;
  
  IfBlock1_clock = iteratorIndex < indexOfBG;
  /* ck_IfBlock1 */ if (IfBlock1_clock) {
    *cont = kcg_true;
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(BG_out, BG_in);
  }
  else {
    else_clock_IfBlock1 = iteratorIndex == indexOfBG;
    /* ck_anon_activ */ if (else_clock_IfBlock1) {
      *cont = kcg_true;
      kcg_copy_positionedBG_T_TrainPosition_Types_Pck(BG_out, BG_shifted_in);
    }
    else {
      *cont = (*BG_shifted_in).valid;
      kcg_copy_positionedBG_T_TrainPosition_Types_Pck(BG_out, BG_shifted_in);
    }
  }
}
/* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBGs_beforeIndex_itr */
void deleteBGs_beforeIndex_itr_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
    /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBGs_beforeIndex_itr::iteratorIndex */ kcg_int iteratorIndex,
    /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBGs_beforeIndex_itr::indexOfBG */ kcg_int indexOfBG,
    /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBGs_beforeIndex_itr::BGs_in */ positionedBGs_T_TrainPosition_Types_Pck *BGs_in,
    /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBGs_beforeIndex_itr::cont */ kcg_bool *cont,
    /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBGs_beforeIndex_itr::BG_out */ positionedBG_T_TrainPosition_Types_Pck *BG_out)
{
    /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBGs_beforeIndex_itr */
    static positionedBG_T_TrainPosition_Types_Pck tmp;

    if ((0 <= iteratorIndex) & (iteratorIndex < 41)) {
        kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
            &tmp,
            &(*BGs_in)[iteratorIndex]);
    }
    else {
        kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
            &tmp,
            (positionedBG_T_TrainPosition_Types_Pck *)
            &cEmptyPositionedBG_CalculateTrainPosition_Pkg_BG_utilities_Pkg);
    }
    *cont = tmp.valid;
    if ((0 <= indexOfBG + iteratorIndex) & (indexOfBG + iteratorIndex < 41)) {
        kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
            BG_out,
            &(*BGs_in)[indexOfBG + iteratorIndex]);
    }
    else {
        kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
            BG_out,
            (positionedBG_T_TrainPosition_Types_Pck *)
            &cEmptyPositionedBG_CalculateTrainPosition_Pkg_BG_utilities_Pkg);
    }
}
/* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern */
void recalculate_BG_locations_astern_CalculateTrainPosition_Pkg_BG_relocation_Pkg(
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern::referenceBG */ positionedBG_T_TrainPosition_Types_Pck *referenceBG,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern::BGs_in */ positionedBGs_T_TrainPosition_Types_Pck *BGs_in,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern::trainProperties */ trainProperties_T_TrainPosition_Types_Pck *trainProperties,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern::BGs_out */ positionedBGs_T_TrainPosition_Types_Pck *BGs_out)
{
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern */ refBGs_T_CalculateTrainPosition_Pkg_BG_relocation_Pkg acc;
  kcg_int i;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern::_L3 */ refBGs_T_CalculateTrainPosition_Pkg_BG_relocation_Pkg _L3;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern::_L4 */ positionedBGs_T_TrainPosition_Types_Pck _L4;
  
  kcg_copy_refBGs_T_CalculateTrainPosition_Pkg_BG_relocation_Pkg(
    &_L3,
    (refBGs_T_CalculateTrainPosition_Pkg_BG_relocation_Pkg *)
      &cNoRefPrevBGs_CalculateTrainPosition_Pkg_BG_relocation_Pkg);
  kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&_L3.refBG, referenceBG);
  for (i = 0; i < 41; i++) {
    kcg_copy_refBGs_T_CalculateTrainPosition_Pkg_BG_relocation_Pkg(&acc, &_L3);
    /* 1 */
    recalculate_BG_locations_astern_itr_CalculateTrainPosition_Pkg_BG_relocation_Pkg(
      &acc,
      &(*BGs_in)[40 - i],
      trainProperties,
      &_L3,
      &_L4[i]);
  }
  for (i = 0; i < 41; i++) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &(*BGs_out)[i],
      &_L4[40 - i]);
  }
}
/* CheckBGConsistency_Pkg::SubFunction::IsBG_announced */
void IsBG_announced_CheckBGConsistency_Pkg_SubFunction(
  /* CheckBGConsistency_Pkg::SubFunction::IsBG_announced::recivedBG_header */ BG_Header_T_BG_Types_Pkg *recivedBG_header,
  /* CheckBGConsistency_Pkg::SubFunction::IsBG_announced::storedBGs */ positionedBGs_T_TrainPosition_Types_Pck *storedBGs,
  /* CheckBGConsistency_Pkg::SubFunction::IsBG_announced::isAnnounced */ kcg_bool *isAnnounced,
  /* CheckBGConsistency_Pkg::SubFunction::IsBG_announced::q_linkorintation */ Q_LINKORIENTATION *q_linkorintation)
{
  /* CheckBGConsistency_Pkg::SubFunction::IsBG_announced */
  static positionedBG_T_TrainPosition_Types_Pck tmp;
  /* CheckBGConsistency_Pkg::SubFunction::IsBG_announced::IfBlock1::then::_L2 */
  static positionedBG_T_TrainPosition_Types_Pck _L2_IfBlock1;
  /* CheckBGConsistency_Pkg::SubFunction::IsBG_announced::isStored */
  static kcg_bool isStored;
  /* CheckBGConsistency_Pkg::SubFunction::IsBG_announced::indexLocal */
  static kcg_int indexLocal;
  
  /* 1 */
  isStored_iter_CheckBGConsistency_Pkg_SubFunction(
    storedBGs,
    recivedBG_header,
    &indexLocal,
    &isStored);
  /* ck_isStored */ if (isStored) {
    if ((0 <= indexLocal) & (indexLocal < 41)) {
      kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
        &_L2_IfBlock1,
        &(*storedBGs)[indexLocal]);
    }
    else {
      kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
        &_L2_IfBlock1,
        (positionedBG_T_TrainPosition_Types_Pck *)
          &cNoStoredBG_CheckBGConsistency_Pkg);
    }
    *isAnnounced = _L2_IfBlock1.infoFromLinking.valid;
    *q_linkorintation =
      _L2_IfBlock1.infoFromLinking.linkingInfo.q_linkorientation;
  }
  else {
    *isAnnounced = kcg_false;
    if ((0 <= indexLocal) & (indexLocal < 41)) {
      kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
        &tmp,
        &(*storedBGs)[indexLocal]);
    }
    else {
      kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
        &tmp,
        (positionedBG_T_TrainPosition_Types_Pck *)
          &cNoStoredBG_CheckBGConsistency_Pkg);
    }
    *q_linkorintation = tmp.infoFromLinking.linkingInfo.q_linkorientation;
  }
}
/* TA_Lib_internal::Get_Position_of_LRBG */
L_internal_Type_Obu_BasicTypes_Pkg Get_Position_of_LRBG_TA_Lib_internal(
  /* TA_Lib_internal::Get_Position_of_LRBG::MessageIn */ ReceivedMessage_T_Common_Types_Pkg *MessageIn,
  /* TA_Lib_internal::Get_Position_of_LRBG::balisegroups */ positionedBGs_T_TrainPosition_Types_Pck *balisegroups)
{
  /* TA_Lib_internal::Get_Position_of_LRBG */ positionedBG_T_TrainPosition_Types_Pck mk_struct;
  /* TA_Lib_internal::Get_Position_of_LRBG */ positionedBG_T_TrainPosition_Types_Pck tmp;
  /* TA_Lib_internal::Get_Position_of_LRBG::_L3 */ kcg_bool _L3;
  /* TA_Lib_internal::Get_Position_of_LRBG::_L2 */ kcg_bool _L2;
  /* TA_Lib_internal::Get_Position_of_LRBG::_L1 */ kcg_int _L1;
  /* TA_Lib_internal::Get_Position_of_LRBG::_L5 */ kcg_int _L5;
  /* TA_Lib_internal::Get_Position_of_LRBG::_L6 */ kcg_int _L6;
  /* TA_Lib_internal::Get_Position_of_LRBG::_L9 */ kcg_bool _L9;
  /* TA_Lib_internal::Get_Position_of_LRBG::Position */ L_internal_Type_Obu_BasicTypes_Pkg Position;
  
  /* 1 */ Eval_LRBG_TA_Lib_internal(MessageIn, &_L9, &_L6, &_L5);
  mk_struct.valid = _L9;
  mk_struct.nid_c = _L6;
  mk_struct.nid_bg = _L5;
  mk_struct.q_link = DEFAULT_q_link_TA_Lib_internal;
  kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
    &mk_struct.location,
    (LocWithInAcc_T_Obu_BasicTypes_Pkg *) &DEFAULT_location_TA_Lib_internal);
  mk_struct.seqNoOnTrack = 0;
  kcg_copy_infoFromLinking_T_TrainPosition_Types_Pck(
    &mk_struct.infoFromLinking,
    (infoFromLinking_T_TrainPosition_Types_Pck *)
      &DEFAULT_InfoFromLinking_TA_Lib_internal);
  kcg_copy_passedBG_T_BG_Types_Pkg(
    &mk_struct.infoFromPassing,
    (passedBG_T_BG_Types_Pkg *) &DEFAULT_InfoFromPassing_TA_Lib_internal);
  mk_struct.missed = kcg_false;
  /* 1 */
  indexOfBG_by_id_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
    &mk_struct,
    balisegroups,
    kcg_true,
    &_L1,
    &_L2,
    &_L3);
  if ((0 <= _L1) & (_L1 < 41)) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp,
      &(*balisegroups)[_L1]);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &DEFAULT_positioned_BG_TA_Lib_internal);
  }
  Position = tmp.location.nominal;
  return Position;
}
/* ValidateDataDirectionGeneral_Pkg::Subfunctions::getLRBGForRadioMessageIterator */
void getLRBGForRadioMessageIterator_ValidateDataDirectionGeneral_Pkg_Subfunctions(
  /* ValidateDataDirectionGeneral_Pkg::Subfunctions::getLRBGForRadioMessageIterator::accumulator */ positionedBG_T_TrainPosition_Types_Pck *accumulator,
  /* ValidateDataDirectionGeneral_Pkg::Subfunctions::getLRBGForRadioMessageIterator::nid_lrbg */ NID_LRBG nid_lrbg,
  /* ValidateDataDirectionGeneral_Pkg::Subfunctions::getLRBGForRadioMessageIterator::positionedBG */ positionedBG_T_TrainPosition_Types_Pck *positionedBG,
  /* ValidateDataDirectionGeneral_Pkg::Subfunctions::getLRBGForRadioMessageIterator::LRBG */ positionedBG_T_TrainPosition_Types_Pck *LRBG)
{
  if ((nid_lrbg == (*positionedBG).nid_bg) & (*positionedBG).valid) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(LRBG, positionedBG);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(LRBG, accumulator);
  }
}
/* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfBG_onTrack */
void indexOfBG_onTrack_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfBG_onTrack::BG */ positionedBG_T_TrainPosition_Types_Pck *BG,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfBG_onTrack::BGs */ positionedBGs_T_TrainPosition_Types_Pck *BGs,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfBG_onTrack::enable */ kcg_bool enable,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfBG_onTrack::indexOfBG */ kcg_int *indexOfBG,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfBG_onTrack::BG_found */ kcg_bool *BG_found,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfBG_onTrack::indexValid */ kcg_bool *indexValid)
{
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfBG_onTrack */
  static kcg_int acc;
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfBG_onTrack */
  static kcg_bool cond_iterw;
  static kcg_int i;
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfBG_onTrack */
  static positionedBG_T_TrainPosition_Types_Pck tmp;
  
  *indexOfBG = cNoValidIndex_CalculateTrainPosition_Pkg;
  if (enable) {
    for (i = 0; i < 41; i++) {
      acc = *indexOfBG;
      /* 1 */
      indexOfBG_onTrack_itr_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
        i,
        acc,
        BG,
        &(*BGs)[i],
        &cond_iterw,
        indexOfBG);
      if (!cond_iterw) {
        break;
      }
    }
  }
  *indexValid = *indexOfBG != cNoValidIndex_CalculateTrainPosition_Pkg;
  if ((0 <= *indexOfBG) & (*indexOfBG < 41)) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&tmp, &(*BGs)[*indexOfBG]);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  *BG_found = *indexValid & /* 1 */
    positionedBGs_ids_equal_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
      BG,
      &tmp);
}
/* ProvidePositionReport_Pkg::op_3_6_5_1_4_j */
void op_3_6_5_1_4_j_ProvidePositionReport_Pkg(
  /* ProvidePositionReport_Pkg::op_3_6_5_1_4_j::LRBG */positionedBG_T_TrainPosition_Types_Pck *LRBG,
  /* ProvidePositionReport_Pkg::op_3_6_5_1_4_j::trainPos */trainPosition_T_TrainPosition_Types_Pck *trainPos,
  outC_op_3_6_5_1_4_j_ProvidePositionReport_Pkg *outC)
{
  static kcg_bool tmp1;
  static NID_BG tmp;
  /* ProvidePositionReport_Pkg::op_3_6_5_1_4_j::_L17 */
  static kcg_bool _L17;
  
  _L17 = (Q_LINK_Linked == (*LRBG).q_link) & (*LRBG).valid;
  if ((*trainPos).linkingIsUsedOnboard) {
    tmp1 = ((*LRBG).nid_bg == (*LRBG).infoFromLinking.linkingInfo.nid_bg) &
      _L17;
  }
  else {
    tmp1 = _L17;
  }
  if (outC->init) {
    outC->init = kcg_false;
    tmp = cPositionedBG_T_ProvidePositionReport_Pkg.nid_bg;
  }
  else {
    tmp = outC->rem_LRBG.nid_bg;
  }
  outC->trigger = tmp1 & ((*LRBG).nid_bg != tmp);
  kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&outC->rem_LRBG, LRBG);
}
/* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocations */
void improveUnlinkedBGLocations_CalculateTrainPosition_Pkg_BG_relocation_Pkg(
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocations::BGs_in */positionedBGs_T_TrainPosition_Types_Pck *BGs_in,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocations::BGs_out */positionedBGs_T_TrainPosition_Types_Pck *BGs_out)
{
  static linkedBGs_indices_T_CalculateTrainPosition_Pkg_BG_relocation_Pkg tmp1;
  static kcg_bool tmp;
  static kcg_int i;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocations::_L6 */
  static kcg_int _L6;
  
  /* 1 */
  findLinkedBGs_CalculateTrainPosition_Pkg_BG_relocation_Pkg(BGs_in, &tmp1);
  for (i = 0; i < 41; i++) {
    /* 1 */
    improveUnlinkedBGLocations_itr_CalculateTrainPosition_Pkg_BG_relocation_Pkg(
      &tmp1[i],
      BGs_in,
      &tmp,
      &(*BGs_out)[i]);
    _L6 = i + 1;
    if (!tmp) {
      break;
    }
  }
#ifdef KCG_MAPW_CPY
  
  for (i = _L6; i < 41; i++) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &(*BGs_out)[i],
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
#endif /* KCG_MAPW_CPY */
  
}
/* CalculateTrainPosition_Pkg::prevPassedLinkedBG */
void prevPassedLinkedBG_CalculateTrainPosition_Pkg(
  /* CalculateTrainPosition_Pkg::prevPassedLinkedBG::passedBG */ passedBG_T_BG_Types_Pkg *passedBG,
  /* CalculateTrainPosition_Pkg::prevPassedLinkedBG::last_BGs */ positionedBGs_T_TrainPosition_Types_Pck *last_BGs,
  /* CalculateTrainPosition_Pkg::prevPassedLinkedBG::previouslyPassedBG */ positionedBG_T_TrainPosition_Types_Pck *previouslyPassedBG)
{
  /* CalculateTrainPosition_Pkg::prevPassedLinkedBG */
  static kcg_bool tmp;
  /* CalculateTrainPosition_Pkg::prevPassedLinkedBG::_L61 */
  static kcg_bool _L61;
  /* CalculateTrainPosition_Pkg::prevPassedLinkedBG::_L60 */
  static kcg_int _L60;
  /* CalculateTrainPosition_Pkg::prevPassedLinkedBG::_L64 */
  static positionedBG_T_TrainPosition_Types_Pck _L64;
  
  /* 1 */
  indexOfLastPassedBG_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
    kcg_true,
    last_BGs,
    (*passedBG).valid,
    &_L60,
    &_L61,
    &tmp);
  if ((0 <= _L60) & (_L60 < 41)) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&_L64, &(*last_BGs)[_L60]);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &_L64,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  tmp = /* 1 */
    nidBG_nidc_equal_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
      _L64.nid_c,
      _L64.nid_bg,
      (*passedBG).BG_Header.nid_c,
      (*passedBG).BG_Header.nid_bg);
  /* 1 */ if (_L61 & !tmp) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(previouslyPassedBG, &_L64);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      previouslyPassedBG,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
}
/* CheckBGConsistency_Pkg::SubFunction::isStored_iter */
void isStored_iter_CheckBGConsistency_Pkg_SubFunction(
  /* CheckBGConsistency_Pkg::SubFunction::isStored_iter::storedBGs */ positionedBGs_T_TrainPosition_Types_Pck *storedBGs,
  /* CheckBGConsistency_Pkg::SubFunction::isStored_iter::bgHeader */ BG_Header_T_BG_Types_Pkg *bgHeader,
  /* CheckBGConsistency_Pkg::SubFunction::isStored_iter::index */ kcg_int *index,
  /* CheckBGConsistency_Pkg::SubFunction::isStored_iter::isStored */ kcg_bool *isStored)
{
  /* CheckBGConsistency_Pkg::SubFunction::isStored_iter */
  static BG_Header_T_BG_Types_Pkg acc;
  /* CheckBGConsistency_Pkg::SubFunction::isStored_iter */
  static kcg_bool cond_iterw;
  static kcg_int i;
  /* CheckBGConsistency_Pkg::SubFunction::isStored_iter */
  static positionedBG_T_TrainPosition_Types_Pck tmp;
  /* CheckBGConsistency_Pkg::SubFunction::isStored_iter::_L9 */
  static BG_Header_T_BG_Types_Pkg _L9;
  /* CheckBGConsistency_Pkg::SubFunction::isStored_iter::_L11 */
  static kcg_int _L11;
  
  kcg_copy_BG_Header_T_BG_Types_Pkg(&_L9, bgHeader);
  for (i = 0; i < 41; i++) {
    kcg_copy_BG_Header_T_BG_Types_Pkg(&acc, &_L9);
    /* 1 */
    isStored_CheckBGConsistency_Pkg_SubFunction(
      &acc,
      &(*storedBGs)[i],
      &cond_iterw,
      &_L9);
    _L11 = i + 1;
    if (!cond_iterw) {
      break;
    }
  }
  *index = _L11 - 1;
  if ((0 <= *index) & (*index < 41)) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp,
      &(*storedBGs)[*index]);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoStoredBG_CheckBGConsistency_Pkg);
  }
  *isStored = tmp.valid;
}
/* CalculateTrainPosition_Pkg::genPassedBG_SeqNo */
void genPassedBG_SeqNo_CalculateTrainPosition_Pkg(
  /* CalculateTrainPosition_Pkg::genPassedBG_SeqNo::passedBG */passedBG_T_BG_Types_Pkg *passedBG,
  /* CalculateTrainPosition_Pkg::genPassedBG_SeqNo::BGs */positionedBGs_T_TrainPosition_Types_Pck *BGs,
  /* CalculateTrainPosition_Pkg::genPassedBG_SeqNo::reset */kcg_bool reset,
  outC_genPassedBG_SeqNo_CalculateTrainPosition_Pkg *outC)
{
  /* CalculateTrainPosition_Pkg::genPassedBG_SeqNo::keepPassedBGSeqNo */
  static kcg_bool keepPassedBGSeqNo;
  /* CalculateTrainPosition_Pkg::genPassedBG_SeqNo::_L5 */
  static kcg_bool _L5;
  /* CalculateTrainPosition_Pkg::genPassedBG_SeqNo::_L4 */
  static kcg_int _L4;
  /* CalculateTrainPosition_Pkg::genPassedBG_SeqNo::_L8 */
  static positionedBG_T_TrainPosition_Types_Pck _L8;
  
  /* 1 */
  indexOfPassedBG_by_id_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
    passedBG,
    BGs,
    (*passedBG).valid,
    &_L4,
    &_L5,
    &keepPassedBGSeqNo);
  if ((0 <= _L4) & (_L4 < 41)) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&_L8, &(*BGs)[_L4]);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &_L8,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  keepPassedBGSeqNo = _L8.valid & _L8.infoFromPassing.valid & _L5;
  /* 1 */
  countUp_CalculateTrainPosition_Pkg_gp_functions_Pkg(
    (kcg_bool) (!keepPassedBGSeqNo & (*passedBG).valid),
    reset,
    &outC->Context_1);
  if (keepPassedBGSeqNo) {
    outC->seqNo = _L8.seqNoOnTrack;
  }
  else {
    outC->seqNo = outC->Context_1.counter;
  }
}
/* CalculateTrainPosition_Pkg::Linking_Pkg::twoConsecutiveLinkedBGs_missed */
void twoConsecutiveLinkedBGs_missed_CalculateTrainPosition_Pkg_Linking_Pkg(
    /* CalculateTrainPosition_Pkg::Linking_Pkg::twoConsecutiveLinkedBGs_missed::missed */ kcg_bool missed,
    /* CalculateTrainPosition_Pkg::Linking_Pkg::twoConsecutiveLinkedBGs_missed::missedLinkedBG */ positionedBG_T_TrainPosition_Types_Pck *missedLinkedBG,
    /* CalculateTrainPosition_Pkg::Linking_Pkg::twoConsecutiveLinkedBGs_missed::passedBG */ positionedBG_T_TrainPosition_Types_Pck *passedBG,
    /* CalculateTrainPosition_Pkg::Linking_Pkg::twoConsecutiveLinkedBGs_missed::reset */ kcg_bool reset,
    outC_twoConsecutiveLinkedBGs_missed_CalculateTrainPosition_Pkg_Linking_Pkg *outC)
{
    /* CalculateTrainPosition_Pkg::Linking_Pkg::twoConsecutiveLinkedBGs_missed::_L9 */
    static positionedBG_T_TrainPosition_Types_Pck _L9;

    /* last_init_ck_storedMissedBG */ if (outC->init) {
        outC->init = kcg_false;
        kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
            &_L9,
            (positionedBG_T_TrainPosition_Types_Pck *)
            &cNoPositionedBG_CalculateTrainPosition_Pkg);
    }
    else {
        kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
            &_L9,
            &outC->storedMissedBG);
    }
    outC->secondConsecutiveBG_missed = missed & /* 1 */
                                       positionedBGs_ids_notEqual_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
                                           missedLinkedBG,
                                           &_L9);
    /* 1 */ if (reset | ((*passedBG).valid & ((*passedBG).q_link ==
                         Q_LINK_Linked) & (*passedBG).infoFromLinking.valid)) {
        kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
            &outC->storedMissedBG,
            (positionedBG_T_TrainPosition_Types_Pck *)
            &cNoPositionedBG_CalculateTrainPosition_Pkg);
    }
    else /* 4 */ if (missed) {
        kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
            &outC->storedMissedBG,
            missedLinkedBG);
    }
    else {
        kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
            &outC->storedMissedBG,
            &_L9);
    }
}
/* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfLastBG */
void indexOfLastBG_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfLastBG::linked */kcg_bool linked,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfLastBG::BGs */positionedBGs_T_TrainPosition_Types_Pck *BGs,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfLastBG::enable */kcg_bool enable,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfLastBG::indexOfBG */kcg_int *indexOfBG,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfLastBG::BG_found */kcg_bool *BG_found,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfLastBG::indexValid */kcg_bool *indexValid)
{
  static kcg_int tmp2;
  static kcg_bool tmp1;
  static kcg_int i;
  static positionedBG_T_TrainPosition_Types_Pck tmp;
  
  *indexOfBG = cNoValidIndex_CalculateTrainPosition_Pkg;
  if (enable) {
    for (i = 0; i < 41; i++) {
      tmp2 = *indexOfBG;
      /* 1 */
      indexOfLastBG_itr_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
        i,
        tmp2,
        linked,
        &(*BGs)[i],
        &tmp1,
        indexOfBG);
      if (!tmp1) {
        break;
      }
    }
  }
  *indexValid = *indexOfBG != cNoValidIndex_CalculateTrainPosition_Pkg;
  if ((0 <= *indexOfBG) & (*indexOfBG < 41)) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&tmp, &(*BGs)[*indexOfBG]);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  *BG_found = *indexValid & tmp.valid;
}
/* CalculateTrainPosition_Pkg::indexOfBG_by_id */
void indexOfBG_by_id_CalculateTrainPosition_Pkg(
  /* CalculateTrainPosition_Pkg::indexOfBG_by_id::BG */ positionedBG_T_TrainPosition_Types_Pck *BG,
  /* CalculateTrainPosition_Pkg::indexOfBG_by_id::BGs */ positionedBGs_T_TrainPosition_Types_Pck *BGs,
  /* CalculateTrainPosition_Pkg::indexOfBG_by_id::enable */ kcg_bool enable,
  /* CalculateTrainPosition_Pkg::indexOfBG_by_id::indexOfBG */ kcg_int *indexOfBG,
  /* CalculateTrainPosition_Pkg::indexOfBG_by_id::BG_found */ kcg_bool *BG_found,
  /* CalculateTrainPosition_Pkg::indexOfBG_by_id::indexValid */ kcg_bool *indexValid)
{
  kcg_int tmp2;
  kcg_bool tmp1;
  kcg_int i;
  positionedBG_T_TrainPosition_Types_Pck tmp;
  
  *indexOfBG = cNoValidIndex_CalculateTrainPosition_Pkg;
  if (enable) {
    for (i = 0; i < 64; i++) {
      tmp2 = *indexOfBG;
      /* 1 */
      indexOfBG_by_id_itr_CalculateTrainPosition_Pkg(
        i,
        tmp2,
        BG,
        &(*BGs)[i],
        &tmp1,
        indexOfBG);
      if (!tmp1) {
        break;
      }
    }
  }
  *indexValid = *indexOfBG != cNoValidIndex_CalculateTrainPosition_Pkg;
  if ((0 <= *indexOfBG) & (*indexOfBG < 64)) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&tmp, &(*BGs)[*indexOfBG]);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  *BG_found = *indexValid & tmp.valid;
}
/* CalculateTrainPosition_Pkg::BG_utilities_Pkg::posInRangeOfBG */
void posInRangeOfBG_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::posInRangeOfBG::position */ LocWithInAcc_T_Obu_BasicTypes_Pkg *position,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::posInRangeOfBG::BGs */ positionedBGs_T_TrainPosition_Types_Pck *BGs,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::posInRangeOfBG::enable */ kcg_bool enable,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::posInRangeOfBG::isInRange */ kcg_bool *isInRange,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::posInRangeOfBG::indexOfBG */ kcg_int *indexOfBG,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::posInRangeOfBG::BG */ positionedBG_T_TrainPosition_Types_Pck *BG)
{
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::posInRangeOfBG */
  static kcg_int acc;
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::posInRangeOfBG */
  static kcg_bool cond_iterw;
  static kcg_int i;
  
  *indexOfBG = cNoValidIndex_CalculateTrainPosition_Pkg;
  if (enable) {
    for (i = 0; i < 41; i++) {
      acc = *indexOfBG;
      /* 1 */
      posInRangeOfBG_itr_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
        i,
        acc,
        position,
        &(*BGs)[i],
        &cond_iterw,
        indexOfBG);
      if (!cond_iterw) {
        break;
      }
    }
  }
  if ((0 <= *indexOfBG) & (*indexOfBG < 41)) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(BG, &(*BGs)[*indexOfBG]);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      BG,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  *isInRange = (*BG).valid;
}
/* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBGs_beforeIndex */
void deleteBGs_beforeIndex_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBGs_beforeIndex::BGs_in */positionedBGs_T_TrainPosition_Types_Pck *BGs_in,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBGs_beforeIndex::indexOfBG */kcg_int indexOfBG,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBGs_beforeIndex::del */kcg_bool del,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBGs_beforeIndex::BGs_out */positionedBGs_T_TrainPosition_Types_Pck *BGs_out)
{
  static kcg_bool tmp;
  static kcg_int i;
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBGs_beforeIndex::_L8 */
  static kcg_bool _L8;
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBGs_beforeIndex::_L20 */
  static array__129125 _L20;
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::deleteBGs_beforeIndex::_L21 */
  static kcg_int _L21;
  
  _L8 = del & (indexOfBG > 0) & (indexOfBG <
      cMaxNoOfStoredBGs_TrainPosition_Types_Pck);
  if (_L8) {
    for (i = 0; i < 41; i++) {
      /* 1 */
      deleteBGs_beforeIndex_itr_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
        i,
        indexOfBG,
        BGs_in,
        &tmp,
        &_L20[i]);
      _L21 = i + 1;
      if (!tmp) {
        break;
      }
    }
  }
  else {
    _L21 = 0;
  }
#ifdef KCG_MAPW_CPY
  
  for (i = _L21; i < 41; i++) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &_L20[i],
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
#endif /* KCG_MAPW_CPY */
  
  if (_L8) {
    kcg_copy_positionedBGs_T_TrainPosition_Types_Pck(BGs_out, &_L20);
  }
  else {
    kcg_copy_positionedBGs_T_TrainPosition_Types_Pck(BGs_out, BGs_in);
  }
}
/* ProvidePositionReport_Pkg::op_GetLRBGfromBGs */
void op_GetLRBGfromBGs_ProvidePositionReport_Pkg(
  /* ProvidePositionReport_Pkg::op_GetLRBGfromBGs::posBGs */ positionedBGs_T_TrainPosition_Types_Pck *posBGs,
  /* ProvidePositionReport_Pkg::op_GetLRBGfromBGs::trainPos */ trainPosition_T_TrainPosition_Types_Pck *trainPos,
  /* ProvidePositionReport_Pkg::op_GetLRBGfromBGs::found */ kcg_bool *found,
  /* ProvidePositionReport_Pkg::op_GetLRBGfromBGs::lrbg */ positionedBG_T_TrainPosition_Types_Pck *lrbg)
{
  /* ProvidePositionReport_Pkg::op_GetLRBGfromBGs */
  static kcg_bool acc;
  /* ProvidePositionReport_Pkg::op_GetLRBGfromBGs */
  static kcg_bool cond_iterw;
  static kcg_int i;
  /* ProvidePositionReport_Pkg::op_GetLRBGfromBGs::_L3 */
  static kcg_int _L3;
  
  *found = kcg_false;
  for (i = 0; i < 41; i++) {
    acc = *found;
    /* 1 */
    op_findBG_ProvidePositionReport_Pkg(
      acc,
      &(*posBGs)[i],
      (*trainPos).LRBG.nid_bg,
      &cond_iterw,
      found);
    _L3 = i + 1;
    if (!cond_iterw) {
      break;
    }
  }
  if ((0 <= _L3 - 1) & (_L3 - 1 < 41)) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(lrbg, &(*posBGs)[_L3 - 1]);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      lrbg,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cPassedBG_ProvidePositionReport_Pkg);
  }
}
/* CalculateTrainPosition_Pkg::prevPassedLinkedBG */
void prevPassedLinkedBG_CalculateTrainPosition_Pkg(
  /* CalculateTrainPosition_Pkg::prevPassedLinkedBG::passedBG */ passedBG_T_BG_Types_Pkg *passedBG,
  /* CalculateTrainPosition_Pkg::prevPassedLinkedBG::lastPassedLinkedBG */ positionedBG_T_TrainPosition_Types_Pck *lastPassedLinkedBG,
  /* CalculateTrainPosition_Pkg::prevPassedLinkedBG::reset */ kcg_bool reset,
  outC_prevPassedLinkedBG_CalculateTrainPosition_Pkg *outC)
{
  /* 1 */
  RisingEdge_digital(
    (kcg_bool)
      ((*lastPassedLinkedBG).valid & (Q_LINK_Linked ==
          (*lastPassedLinkedBG).q_link) & !/* 1 */
        nidBG_nidc_equal_CalculateTrainPosition_Pkg(
          (*lastPassedLinkedBG).nid_c,
          (*lastPassedLinkedBG).nid_bg,
          (*passedBG).BG_Header.nid_c,
          (*passedBG).BG_Header.nid_bg) & ((*passedBG).BG_Header.q_link ==
          Q_LINK_Linked) & (*passedBG).valid),
    &outC->Context_1);
  if (reset) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &outC->previouslyPassedBG,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  else if (outC->Context_1.RE_Output) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &outC->previouslyPassedBG,
      lastPassedLinkedBG);
  }
  else if (outC->init) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &outC->previouslyPassedBG,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  outC->init = kcg_false;
}
/* CalculateTrainPosition_Pkg::BG_utilities_Pkg::trimSeqNoOnTrack_itr */
void trimSeqNoOnTrack_itr_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::trimSeqNoOnTrack_itr::prevSeqNo */ kcg_int prevSeqNo,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::trimSeqNoOnTrack_itr::BG_in */ positionedBG_T_TrainPosition_Types_Pck *BG_in,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::trimSeqNoOnTrack_itr::seqNo */ kcg_int *seqNo,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::trimSeqNoOnTrack_itr::BG_out */ positionedBG_T_TrainPosition_Types_Pck *BG_out)
{
  /* 1 */ if ((*BG_in).valid & (*BG_in).infoFromPassing.valid) {
    *seqNo = (*BG_in).seqNoOnTrack;
  }
  else {
    *seqNo = prevSeqNo + 1;
  }
  kcg_copy_positionedBG_T_TrainPosition_Types_Pck(BG_out, BG_in);
  (*BG_out).seqNoOnTrack = *seqNo;
}
/* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocation */
void improveUnlinkedBGLocation_CalculateTrainPosition_Pkg_BG_relocation_Pkg(
    /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocation::passedLinkedBG_2 */ positionedBG_T_TrainPosition_Types_Pck *passedLinkedBG_2,
    /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocation::passedLinkedBG_1 */ positionedBG_T_TrainPosition_Types_Pck *passedLinkedBG_1,
    /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocation::unlinkedBG_in */ positionedBG_T_TrainPosition_Types_Pck *unlinkedBG_in,
    /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocation::unlinkedBG_out */ positionedBG_T_TrainPosition_Types_Pck *unlinkedBG_out)
{
    /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocation */
    static LocWithInAcc_T_Obu_BasicTypes_Pkg tmp;
    /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocation::_L31 */
    static kcg_bool _L31;
    /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocation::_L30 */
    static LocWithInAcc_T_Obu_BasicTypes_Pkg _L30;

    /* 1 */
    odoLoc_2_refLocations_BasicLocationFunctions_Pkg(
        &(*passedLinkedBG_2).location,
        &(*passedLinkedBG_1).location,
        &(*passedLinkedBG_2).infoFromPassing.BG_Header.bgPosition.odo,
        &(*passedLinkedBG_1).infoFromPassing.BG_Header.bgPosition.odo,
        &(*unlinkedBG_in).infoFromPassing.BG_Header.bgPosition.odo,
        &tmp);
    /* 1 */
    overlapOf_2_Locations_BasicLocationFunctions_Pkg(
        &tmp,
        &(*unlinkedBG_in).location,
        &_L30,
        &_L31);
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
        unlinkedBG_out,
        unlinkedBG_in);
    /* 1 */ if ((*passedLinkedBG_2).valid & ((*passedLinkedBG_2).q_link ==
                Q_LINK_Linked) & (*passedLinkedBG_2).infoFromPassing.valid &
                !kcg_comp_positionedBG_T_TrainPosition_Types_Pck(
                    passedLinkedBG_2,
                    passedLinkedBG_1) & ((*passedLinkedBG_1).valid &
                                         ((*passedLinkedBG_1).q_link == Q_LINK_Linked) &
                                         (*passedLinkedBG_1).infoFromPassing.valid) & ((*unlinkedBG_in).valid &
                                                 ((*unlinkedBG_in).q_link == Q_LINK_Unlinked)) & _L31) {
        kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
            &(*unlinkedBG_out).location,
            &_L30);
    }
    else {
        kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
            &(*unlinkedBG_out).location,
            &(*unlinkedBG_in).location);
    }
}
/* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocations_itr */
void improveUnlinkedBGLocations_itr_CalculateTrainPosition_Pkg_BG_relocation_Pkg(
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocations_itr::BG_index_in */ linkedBG_index_T_CalculateTrainPosition_Pkg_BG_relocation_Pkg *BG_index_in,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocations_itr::BGs_in */ positionedBGs_T_TrainPosition_Types_Pck *BGs_in,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocations_itr::cont */ kcg_bool *cont,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocations_itr::BG_out */ positionedBG_T_TrainPosition_Types_Pck *BG_out)
{
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocations_itr */ positionedBG_T_TrainPosition_Types_Pck tmp1;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocations_itr */ positionedBG_T_TrainPosition_Types_Pck tmp;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::improveUnlinkedBGLocations_itr::_L2 */ positionedBG_T_TrainPosition_Types_Pck _L2;
  
  if ((0 <= (*BG_index_in).currentIndex) & ((*BG_index_in).currentIndex < 41)) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &_L2,
      &(*BGs_in)[(*BG_index_in).currentIndex]);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &_L2,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  *cont = _L2.valid;
  if ((0 <= (*BG_index_in).subsequentLinkedBG_idx) &
    ((*BG_index_in).subsequentLinkedBG_idx < 41)) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp1,
      &(*BGs_in)[(*BG_index_in).subsequentLinkedBG_idx]);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp1,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  if ((0 <= (*BG_index_in).previousLinkedBG_idx) &
    ((*BG_index_in).previousLinkedBG_idx < 41)) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp,
      &(*BGs_in)[(*BG_index_in).previousLinkedBG_idx]);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  /* 1 */
  improveUnlinkedBGLocation_CalculateTrainPosition_Pkg_BG_relocation_Pkg(
    &tmp1,
    &tmp,
    &_L2,
    BG_out);
}
/* CalculateTrainPosition_Pkg::Linking_Pkg::linkingIsUsed */
void linkingIsUsed_CalculateTrainPosition_Pkg_Linking_Pkg(
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkingIsUsed::currentOdometry */ odometry_T_Obu_BasicTypes_Pkg *currentOdometry,
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkingIsUsed::BGs */ positionedBGs_T_TrainPosition_Types_Pck *BGs,
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkingIsUsed::recalculateBGs */ kcg_bool recalculateBGs,
  outC_linkingIsUsed_CalculateTrainPosition_Pkg_Linking_Pkg *outC)
{
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkingIsUsed */
  static positionedBG_T_TrainPosition_Types_Pck tmp;
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkingIsUsed */
  static kcg_bool _1_op_call;
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkingIsUsed */
  static kcg_bool op_call;
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkingIsUsed::lastLinkedBG */
  static positionedBG_T_TrainPosition_Types_Pck lastLinkedBG;
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkingIsUsed::_L28 */
  static LocWithInAcc_T_Obu_BasicTypes_Pkg _L28;
  
  /* ck_recalculateBGs */ if (recalculateBGs) {
    /* 1 */
    indexOfLastBG_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
      kcg_true,
      BGs,
      recalculateBGs,
      &outC->_L9,
      &outC->_L10,
      &_1_op_call);
    /* 1 */
    indexOfLastPassedBG_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
      kcg_true,
      BGs,
      recalculateBGs,
      &outC->_L6,
      &outC->_L7,
      &op_call);
  }
  else if (outC->init) {
    outC->_L10 = kcg_false;
    outC->_L7 = kcg_false;
    outC->_L6 = cNoValidIndex_CalculateTrainPosition_Pkg;
    outC->_L9 = cNoValidIndex_CalculateTrainPosition_Pkg;
  }
  outC->init = kcg_false;
  if ((0 <= outC->_L9) & (outC->_L9 < 41)) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &lastLinkedBG,
      &(*BGs)[outC->_L9]);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &lastLinkedBG,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  if ((0 <= outC->_L6) & (outC->_L6 < 41)) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&tmp, &(*BGs)[outC->_L6]);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  /* 1 */
  positionDerivedFromPassedBG_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
    &(*currentOdometry).odo,
    &tmp,
    &_L28);
  outC->linkingIsUsed = !(_L28.nominal + _L28.d_min >
      lastLinkedBG.location.nominal + lastLinkedBG.location.d_max) &
    (outC->_L7 & (outC->_L6 < outC->_L9) & outC->_L10);
}
/* CalculateTrainPosition_Pkg::addAnnouncedBGs */
void addAnnouncedBGs_CalculateTrainPosition_Pkg(
  /* CalculateTrainPosition_Pkg::addAnnouncedBGs::passedBG */ passedBG_T_BG_Types_Pkg *passedBG,
  /* CalculateTrainPosition_Pkg::addAnnouncedBGs::BGs_in */ positionedBGs_T_TrainPosition_Types_Pck *BGs_in,
  /* CalculateTrainPosition_Pkg::addAnnouncedBGs::trainProperties */ trainProperties_T_TrainPosition_Types_Pck *trainProperties,
  /* CalculateTrainPosition_Pkg::addAnnouncedBGs::BGs_out */ positionedBGs_T_TrainPosition_Types_Pck *BGs_out,
  /* CalculateTrainPosition_Pkg::addAnnouncedBGs::overrun */ kcg_bool *overrun)
{
  /* CalculateTrainPosition_Pkg::addAnnouncedBGs */
  static positionedBGs_T_TrainPosition_Types_Pck tmp1;
  /* CalculateTrainPosition_Pkg::addAnnouncedBGs */
  static positionedBG_T_TrainPosition_Types_Pck tmp;
  /* CalculateTrainPosition_Pkg::addAnnouncedBGs::_L10 */
  static NID_BG _L10;
  /* CalculateTrainPosition_Pkg::addAnnouncedBGs::_L9 */
  static NID_C _L9;
  /* CalculateTrainPosition_Pkg::addAnnouncedBGs::_L11 */
  static kcg_bool _L11;
  /* CalculateTrainPosition_Pkg::addAnnouncedBGs::_L14 */
  static kcg_bool _L14;
  /* CalculateTrainPosition_Pkg::addAnnouncedBGs::_L13 */
  static kcg_bool _L13;
  /* CalculateTrainPosition_Pkg::addAnnouncedBGs::_L33 */
  static positionedBGs_T_TrainPosition_Types_Pck _L33;
  static kcg_int i;
  
  _L11 = (*passedBG).valid & (*passedBG).linkedBGs[0].valid;
  /* 1 */
  NIDLRBG_2_nidC_nidBG_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
    _L11,
    (*passedBG).linkedBGs[0].nid_LRBG,
    &_L9,
    &_L10);
  kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
    &tmp,
    (positionedBG_T_TrainPosition_Types_Pck *)
      &cNoPositionedBG_CalculateTrainPosition_Pkg);
  tmp.valid = _L11;
  tmp.nid_c = _L9;
  tmp.nid_bg = _L10;
  /* 1 */
  indexOfBG_by_id_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
    &tmp,
    BGs_in,
    _L11,
    &i,
    &_L13,
    &_L14);
  if ((0 <= i) & (i < 41)) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&tmp, &(*BGs_in)[i]);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  /* 1 */
  positionLinkedBGs_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
    &tmp,
    &(*passedBG).linkedBGs,
    trainProperties,
    (linkedBGs_asPositionedBGs_T_TrainPosition_Types_Pck *) &tmp1[0]);
  for (i = 0; i < 8; i++) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &(&tmp1[33])[i],
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  /* 1 */
  mergeBGs_onTrack_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
    BGs_in,
    &tmp1,
    &_L33,
    overrun);
  /* 1 */
  trimSeqNoOnTrack_CalculateTrainPosition_Pkg_BG_utilities_Pkg(&_L33, BGs_out);
}
/* CalculateTrainPosition_Pkg::passing_a_BG */
void passing_a_BG_CalculateTrainPosition_Pkg(
  /* CalculateTrainPosition_Pkg::passing_a_BG::passedBG */ passedBG_T_BG_Types_Pkg *passedBG,
  /* CalculateTrainPosition_Pkg::passing_a_BG::previouslyPassedLinkedBG */ positionedBG_T_TrainPosition_Types_Pck *previouslyPassedLinkedBG,
  /* CalculateTrainPosition_Pkg::passing_a_BG::BGs_in */ positionedBGs_T_TrainPosition_Types_Pck *BGs_in,
  /* CalculateTrainPosition_Pkg::passing_a_BG::passedBGSeqNo */ kcg_int passedBGSeqNo,
  /* CalculateTrainPosition_Pkg::passing_a_BG::trainProperties */ trainProperties_T_TrainPosition_Types_Pck *trainProperties,
  /* CalculateTrainPosition_Pkg::passing_a_BG::passedPositionedBG */ positionedBG_T_TrainPosition_Types_Pck *passedPositionedBG,
  /* CalculateTrainPosition_Pkg::passing_a_BG::BGs_out */ positionedBGs_T_TrainPosition_Types_Pck *BGs_out,
  /* CalculateTrainPosition_Pkg::passing_a_BG::overrun */ kcg_bool *overrun,
  /* CalculateTrainPosition_Pkg::passing_a_BG::foundNotWhereAnnounced */ kcg_bool *foundNotWhereAnnounced,
  /* CalculateTrainPosition_Pkg::passing_a_BG::BGpassedInUnexpectedDirection */ kcg_bool *BGpassedInUnexpectedDirection)
{
  /* CalculateTrainPosition_Pkg::passing_a_BG */
  static positionedBG_T_TrainPosition_Types_Pck tmp1;
  /* CalculateTrainPosition_Pkg::passing_a_BG */
  static positionedBGs_T_TrainPosition_Types_Pck tmp;
  /* CalculateTrainPosition_Pkg::passing_a_BG::_L16 */
  static positionedBGs_T_TrainPosition_Types_Pck _L16;
  /* CalculateTrainPosition_Pkg::passing_a_BG::_L17 */
  static kcg_bool _L17;
  /* CalculateTrainPosition_Pkg::passing_a_BG::_L21 */
  static positionedBGs_T_TrainPosition_Types_Pck _L21;
  /* CalculateTrainPosition_Pkg::passing_a_BG::_L22 */
  static kcg_bool _L22;
  static kcg_int i;
  
  /* 1 */
  indexOfPassedBG_by_id_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
    passedBG,
    BGs_in,
    (*passedBG).valid,
    &i,
    &_L22,
    &_L17);
  /* 1 */ if (_L22) {
    if ((0 <= i) & (i < 41)) {
      kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&tmp1, &(*BGs_in)[i]);
    }
    else {
      kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
        &tmp1,
        (positionedBG_T_TrainPosition_Types_Pck *)
          &cNoPositionedBG_CalculateTrainPosition_Pkg);
    }
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp1,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  /* 1 */
  passedBG_2_positionedBG_CalculateTrainPosition_Pkg(
    passedBG,
    &tmp1,
    previouslyPassedLinkedBG,
    passedBGSeqNo,
    trainProperties,
    passedPositionedBG,
    foundNotWhereAnnounced,
    BGpassedInUnexpectedDirection,
    (linkedBGs_asPositionedBGs_T_TrainPosition_Types_Pck *) &tmp[0]);
  /* 2 */
  mergeBG_onTrack_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
    passedPositionedBG,
    BGs_in,
    &_L16,
    &_L17);
  for (i = 0; i < 8; i++) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &(&tmp[33])[i],
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  /* 1 */
  mergeBGs_onTrack_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
    &_L16,
    &tmp,
    &_L21,
    &_L22);
  *overrun = _L22 | _L17;
  /* 1 */
  trimSeqNoOnTrack_CalculateTrainPosition_Pkg_BG_utilities_Pkg(&_L21, BGs_out);
}
/* CalculateTrainPosition_Pkg::calculateTrainPosition */
void calculateTrainPosition_CalculateTrainPosition_Pkg(
  /* CalculateTrainPosition_Pkg::calculateTrainPosition::currentOdometry */ odometry_T_Obu_BasicTypes_Pkg *currentOdometry,
  /* CalculateTrainPosition_Pkg::calculateTrainPosition::passedBG */ passedBG_T_BG_Types_Pkg *passedBG,
  /* CalculateTrainPosition_Pkg::calculateTrainPosition::msgFromTrack */ ReceivedMessage_T_Common_Types_Pkg *msgFromTrack,
  /* CalculateTrainPosition_Pkg::calculateTrainPosition::trainProperties */ trainProperties_T_TrainPosition_Types_Pck *trainProperties,
  /* CalculateTrainPosition_Pkg::calculateTrainPosition::reset */ kcg_bool reset,
  outC_calculateTrainPosition_CalculateTrainPosition_Pkg *outC)
{
  positionedBGs_T_TrainPosition_Types_Pck tmp;
  /* CalculateTrainPosition_Pkg::calculateTrainPosition::if_BGpassed_or_onlyAnnounced::then::_L10 */ positionedBGs_T_TrainPosition_Types_Pck _L10_if_BGpassed_or_onlyAnnounced;
  /* CalculateTrainPosition_Pkg::calculateTrainPosition::if_BGpassed_or_onlyAnnounced::else::then::_L13 */ kcg_bool _L13_if_BGpassed_or_onlyAnnounced;
  /* CalculateTrainPosition_Pkg::calculateTrainPosition::BGs_loc */ positionedBGs_T_TrainPosition_Types_Pck last_BGs_loc;
  /* CalculateTrainPosition_Pkg::calculateTrainPosition::if_BGpassed_or_onlyAnnounced */ kcg_bool if_BGpassed_or_onlyAnnounced_clock;
  /* CalculateTrainPosition_Pkg::calculateTrainPosition::BG_passed */ kcg_bool BG_passed;
  /* CalculateTrainPosition_Pkg::calculateTrainPosition::onlyBGsAnnouncedViaRadio */ kcg_bool onlyBGsAnnouncedViaRadio;
  /* CalculateTrainPosition_Pkg::calculateTrainPosition::errors_loc */ positionErrors_T_TrainPosition_Types_Pck errors_loc;
  /* CalculateTrainPosition_Pkg::calculateTrainPosition::passedBG_asPositionedBG */ positionedBG_T_TrainPosition_Types_Pck passedBG_asPositionedBG;
  /* CalculateTrainPosition_Pkg::calculateTrainPosition::trainPositionInfo */ trainPositionInfo_T_TrainPosition_Types_Pck trainPositionInfo;
  /* CalculateTrainPosition_Pkg::calculateTrainPosition::passedBG_loc */ passedBG_T_BG_Types_Pkg passedBG_loc;
  /* CalculateTrainPosition_Pkg::calculateTrainPosition::_L306 */ passedBG_T_BG_Types_Pkg _L306;
  
  outC->errors.doubleRepositioningError = kcg_false;
  if (outC->init) {
    outC->init = kcg_false;
    kcg_copy_positionedBGs_T_TrainPosition_Types_Pck(
      &last_BGs_loc,
      (positionedBGs_T_TrainPosition_Types_Pck *)
        &cNoPositionedBGs_CalculateTrainPosition_Pkg);
  }
  else {
    kcg_copy_positionedBGs_T_TrainPosition_Types_Pck(&last_BGs_loc, &outC->BGs);
  }
  /* 1 */
  msg_2_passedBG_CalculateTrainPosition_Pkg_msgAdapter_Pkg(
    msgFromTrack,
    &_L306,
    &if_BGpassed_or_onlyAnnounced_clock,
    &_L13_if_BGpassed_or_onlyAnnounced);
  if ((*passedBG).valid) {
    BG_passed = (*passedBG).BG_Header.valid & (*passedBG).valid;
    onlyBGsAnnouncedViaRadio = !(*passedBG).BG_Header.valid & (*passedBG).valid;
    kcg_copy_passedBG_T_BG_Types_Pkg(&passedBG_loc, passedBG);
  }
  else {
    BG_passed = if_BGpassed_or_onlyAnnounced_clock;
    onlyBGsAnnouncedViaRadio = _L13_if_BGpassed_or_onlyAnnounced;
    kcg_copy_passedBG_T_BG_Types_Pkg(&passedBG_loc, &_L306);
  }
  if_BGpassed_or_onlyAnnounced_clock = BG_passed | reset;
  if (if_BGpassed_or_onlyAnnounced_clock) {
    if (reset) {
      kcg_copy_positionedBGs_T_TrainPosition_Types_Pck(
        &tmp,
        (positionedBGs_T_TrainPosition_Types_Pck *)
          &cNoPositionedBGs_CalculateTrainPosition_Pkg);
    }
    else {
      kcg_copy_positionedBGs_T_TrainPosition_Types_Pck(&tmp, &last_BGs_loc);
    }
    /* 6 */
    calculateBGLocations_CalculateTrainPosition_Pkg(
      &passedBG_loc,
      &tmp,
      reset,
      trainProperties,
      &outC->Context_6);
    kcg_copy_positionedBGs_T_TrainPosition_Types_Pck(
      &_L10_if_BGpassed_or_onlyAnnounced,
      &outC->Context_6.BGs);
    kcg_copy_positionErrors_T_TrainPosition_Types_Pck(
      &errors_loc,
      &outC->Context_6.errors);
    /* 2 */
    delDispensableBGs_CalculateTrainPosition_Pkg(
      &_L10_if_BGpassed_or_onlyAnnounced,
      kcg_true,
      &outC->BGs);
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &passedBG_asPositionedBG,
      &outC->Context_6.passedPositionedBG);
  }
  else {
    if (onlyBGsAnnouncedViaRadio) {
      /* 1 */
      addAnnouncedBGs_CalculateTrainPosition_Pkg(
        &passedBG_loc,
        &last_BGs_loc,
        trainProperties,
        &outC->BGs,
        &_L13_if_BGpassed_or_onlyAnnounced);
      kcg_copy_positionErrors_T_TrainPosition_Types_Pck(
        &errors_loc,
        (positionErrors_T_TrainPosition_Types_Pck *)
          &cNoPositionErrors_CalculateTrainPosition_Pkg);
      errors_loc.outOfMemSpace = _L13_if_BGpassed_or_onlyAnnounced;
    }
    else {
      kcg_copy_positionErrors_T_TrainPosition_Types_Pck(
        &errors_loc,
        (positionErrors_T_TrainPosition_Types_Pck *)
          &cNoPositionErrors_CalculateTrainPosition_Pkg);
      kcg_copy_positionedBGs_T_TrainPosition_Types_Pck(
        &outC->BGs,
        &last_BGs_loc);
    }
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &passedBG_asPositionedBG,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  outC->errors.outOfMemSpace = errors_loc.outOfMemSpace;
  outC->errors.passedBG_foundNotWhereExpected =
    errors_loc.passedBG_foundNotWhereExpected;
  outC->errors.BGpassedInUnexpectedDirection =
    errors_loc.BGpassedInUnexpectedDirection;
  /* 1 */
  calculateTrainPositionInfo_CalculateTrainPosition_Pkg(
    currentOdometry,
    &outC->BGs,
    (kcg_bool) (onlyBGsAnnouncedViaRadio | BG_passed | reset),
    &passedBG_asPositionedBG,
    reset,
    &outC->Context_1);
  outC->errors.positionCalculation_inconsistent =
    outC->Context_1.positionCalculationNotConsistent;
  kcg_copy_trainPositionInfo_T_TrainPosition_Types_Pck(
    &trainPositionInfo,
    &outC->Context_1.trainPositionInfo);
  /* 2 */
  linkedBG_missed_CalculateTrainPosition_Pkg_Linking_Pkg(
    &trainPositionInfo.trainPosition,
    &outC->BGs,
    kcg_true,
    &outC->Context_2);
  outC->errors.linkedBGMissed = outC->Context_2.missed;
  outC->errors.BG_LinkingConsistencyError = outC->Context_2.missed |
    errors_loc.BG_LinkingConsistencyError;
  /* 1 */
  twoConsecutiveLinkedBGs_missed_CalculateTrainPosition_Pkg_Linking_Pkg(
    outC->Context_2.missed,
    &outC->Context_2.BG,
    &passedBG_asPositionedBG,
    reset,
    &outC->_1_Context_1);
  outC->errors.twoConsecutiveLinkedBGs_missed =
    outC->_1_Context_1.secondConsecutiveBG_missed;
  if (outC->Context_2.missed) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &outC->errors.bg,
      &outC->Context_2.BG);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &outC->errors.bg,
      &errors_loc.bg);
  }
  /* 1 */
  calculateTrainpositionAttributes_CalculateTrainPosition_Pkg(
    &trainPositionInfo,
    currentOdometry,
    trainProperties,
    &outC->trainPosition);
}
/* CalculateTrainPosition_Pkg::Linking_Pkg::linkedBG_missed */
void linkedBG_missed_CalculateTrainPosition_Pkg_Linking_Pkg(
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkedBG_missed::position */ LocWithInAcc_T_Obu_BasicTypes_Pkg *position,
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkedBG_missed::BGs_in */ positionedBGs_T_TrainPosition_Types_Pck *BGs_in,
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkedBG_missed::enable */ kcg_bool enable,
  outC_linkedBG_missed_CalculateTrainPosition_Pkg_Linking_Pkg *outC)
{
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkedBG_missed */
  static LocWithInAcc_T_Obu_BasicTypes_Pkg tmp1;
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkedBG_missed */
  static LocWithInAcc_T_Obu_BasicTypes_Pkg tmp;
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkedBG_missed::_L1 */
  static kcg_bool _L1;
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkedBG_missed::_L52 */
  static LocWithInAcc_T_Obu_BasicTypes_Pkg _L52;
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkedBG_missed::_L69 */
  static kcg_bool _L69;
  /* CalculateTrainPosition_Pkg::Linking_Pkg::linkedBG_missed::_L67 */
  static kcg_int _L67;
  
  /* last_init_ck_position */ if (outC->init) {
    outC->init = kcg_false;
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &outC->BG,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
    outC->indexOfBG = cNoValidIndex_CalculateTrainPosition_Pkg;
    kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
      &_L52,
      (LocWithInAcc_T_Obu_BasicTypes_Pkg *)
        &cLocWithInAcc_0_Obu_BasicTypes_Pkg);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&outC->BG, &outC->_L3);
    outC->indexOfBG = outC->_L2;
    kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(&_L52, &outC->rem_position);
  }
  /* 2 */ sub_2_distances_BasicLocationFunctions_Pkg(position, &_L52, &tmp1);
  _L1 = tmp1.nominal >= 0;
  /* ck_movedAhead */ if (_L1) {
    tmp.nominal = (*position).nominal;
    tmp.d_min = _L52.nominal + _L52.d_min - (*position).nominal;
    tmp.d_max = (*position).d_max;
  }
  else {
    tmp.nominal = (*position).nominal;
    tmp.d_min = (*position).d_min;
    tmp.d_max = _L52.nominal + _L52.d_max - (*position).nominal;
  }
  /* 1 */
  posInRangeOfBG_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
    &tmp,
    BGs_in,
    enable,
    &_L1,
    &outC->_L2,
    &outC->_L3);
  /* 1 */ FallingEdge_digital(_L1, &outC->Context_1);
  outC->missed = ((/* 1 */
        positionedBGs_ids_notEqual_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
          &outC->_L3,
          &outC->BG) & _L1) | outC->Context_1.FE_Output) & (outC->BG.q_link ==
      Q_LINK_Linked) & !outC->BG.infoFromPassing.valid;
  outC->BG.missed = outC->missed;
  /* 1 */
  indexOfBG_by_id_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
    &outC->BG,
    BGs_in,
    outC->missed,
    &_L67,
    &_L1,
    &_L69);
  /* 1 */ if (_L1 & outC->missed) {
    kcg_copy_positionedBGs_T_TrainPosition_Types_Pck(&outC->BGs_out, BGs_in);
    if ((0 <= _L67) & (_L67 < 41)) {
      kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
        &outC->BGs_out[_L67],
        &outC->BG);
    }
  }
  else {
    kcg_copy_positionedBGs_T_TrainPosition_Types_Pck(&outC->BGs_out, BGs_in);
  }
  kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(&outC->rem_position, position);
}
/* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr */
void recalculate_BG_locations_ahead_itr_CalculateTrainPosition_Pkg_BG_relocation_Pkg(
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::refBGs_in */ refBGs_T_CalculateTrainPosition_Pkg_BG_relocation_Pkg *refBGs_in,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::BG_in */ positionedBG_T_TrainPosition_Types_Pck *BG_in,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::trainProperties */ trainProperties_T_TrainPosition_Types_Pck *trainProperties,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::refBGs_out */ refBGs_T_CalculateTrainPosition_Pkg_BG_relocation_Pkg *refBGs_out,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::BG_out */ positionedBG_T_TrainPosition_Types_Pck *BG_out)
{
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr */ LocWithInAcc_T_Obu_BasicTypes_Pkg tmp1;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr */ positionedBG_T_TrainPosition_Types_Pck tmp;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::BGin_is_refBG */ kcg_bool BGin_is_refBG;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::refLocation */ LocWithInAcc_T_Obu_BasicTypes_Pkg refLocation;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::refBG */ positionedBG_T_TrainPosition_Types_Pck refBG;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::relocatedBG */ positionedBG_T_TrainPosition_Types_Pck relocatedBG;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::sumOfBestDistances */ LocWithInAcc_T_Obu_BasicTypes_Pkg sumOfBestDistances;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::_L96 */ kcg_bool _L96;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::_L106 */ kcg_bool _L106;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::_L137 */ kcg_bool _L137;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_ahead_itr::_L302 */ LocWithInAcc_T_Obu_BasicTypes_Pkg _L302;
  
  BGin_is_refBG = /* 3 */
    positionedBGs_ids_equal_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
      &(*refBGs_in).refBG,
      BG_in);
  (*refBGs_out).recalculate = BGin_is_refBG | ((*refBGs_in).recalculate &
      (*BG_in).valid);
  /* calculateLocalBGInaccuracies */
  calculateLocalBGInaccuracies_CalculateTrainPosition_Pkg_BG_relocation_Pkg(
    BG_in,
    trainProperties,
    &refLocation);
  kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
    &_L302,
    (LocWithInAcc_T_Obu_BasicTypes_Pkg *) &cLocWithInAcc_0_Obu_BasicTypes_Pkg);
  _L302.nominal = (*BG_in).location.nominal;
  /* 6 */
  add_2_Distances_BasicLocationFunctions_Pkg(&refLocation, &_L302, &tmp1);
  /* 1 */
  overlapOf_2_Locations_BasicLocationFunctions_Pkg(
    &tmp1,
    &(*BG_in).location,
    &_L302,
    &_L106);
  /* 14 */ if (BGin_is_refBG) {
    /* 31 */ if (_L106) {
      kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(&refLocation, &_L302);
    }
    else {
      kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
        &refLocation,
        &(*BG_in).location);
    }
  }
  else {
    kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
      &refLocation,
      &(*BG_in).location);
  }
  kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
    &relocatedBG,
    &(*refBGs_in).refBG);
  kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
    &relocatedBG.location,
    &refLocation);
  /* 24 */ if (BGin_is_refBG) {
    /* 25 */ if ((*refBGs_in).refBG.valid &
      (*refBGs_in).refBG.infoFromLinking.valid) {
      kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&refBG, &relocatedBG);
      kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
        &refBG.infoFromLinking.expectedLocation,
        &refLocation);
    }
    else {
      kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&refBG, &relocatedBG);
    }
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &refBG,
      &(*refBGs_in).refBG);
  }
  kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&(*refBGs_out).refBG, &refBG);
  _L106 = Q_LINK_Linked == refBG.q_link;
  _L96 = BGin_is_refBG & !_L106 & refBG.infoFromPassing.valid &
    (*refBGs_in).prevLinkedBG.valid &
    (*refBGs_in).prevLinkedBG.infoFromPassing.valid;
  /* 2 */
  sub_2_odoDistances_BasicLocationFunctions_Pkg(
    &refBG.infoFromPassing.BG_Header.bgPosition.odo,
    &(*refBGs_in).prevLinkedBG.infoFromPassing.BG_Header.bgPosition.odo,
    &tmp1);
  /* 9 */
  add_2_Distances_BasicLocationFunctions_Pkg(
    &tmp1,
    &(*refBGs_in).prevLinkedBG.infoFromPassing.BG_Header.BG_centerDetectionInaccuraccuracies,
    &_L302);
  /* 27 */ if (BGin_is_refBG & (*BG_in).valid) {
    /* 30 */ if (_L96) {
      kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(&tmp1, &_L302);
    }
    else {
      kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
        &tmp1,
        (LocWithInAcc_T_Obu_BasicTypes_Pkg *)
          &cLocWithInAcc_0_Obu_BasicTypes_Pkg);
    }
    /* 4 */
    sub_2_distances_BasicLocationFunctions_Pkg(
      (LocWithInAcc_T_Obu_BasicTypes_Pkg *) &cLocWithInAcc_0_Obu_BasicTypes_Pkg,
      &tmp1,
      &sumOfBestDistances);
  }
  else /* 28 */ if ((*BG_in).valid & (*BG_in).infoFromLinking.valid) {
    /* 7 */
    add_2_Distances_BasicLocationFunctions_Pkg(
      &(*BG_in).infoFromLinking.d_link,
      &(*refBGs_in).sumOfBestDistances,
      &sumOfBestDistances);
  }
  else /* 29 */ if ((*BG_in).valid & ((*BG_in).q_link == Q_LINK_Linked) &
    (*BG_in).infoFromPassing.valid & (*refBGs_in).prevLinkedBG.valid &
    (*refBGs_in).prevLinkedBG.infoFromPassing.valid) {
    /* 4 */
    sub_2_odoDistances_BasicLocationFunctions_Pkg(
      &(*BG_in).infoFromPassing.BG_Header.bgPosition.odo,
      &(*refBGs_in).prevLinkedBG.infoFromPassing.BG_Header.bgPosition.odo,
      &refLocation);
    /* 8 */
    add_2_Distances_BasicLocationFunctions_Pkg(
      &refLocation,
      &(*refBGs_in).sumOfBestDistances,
      &sumOfBestDistances);
  }
  else {
    kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
      &sumOfBestDistances,
      &(*refBGs_in).sumOfBestDistances);
  }
  kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
    &(*refBGs_out).sumOfBestDistances,
    &sumOfBestDistances);
  /* 23 */ if ((*refBGs_in).recalculate) {
    /* 1 */
    recalculate_BG_location_ahead_CalculateTrainPosition_Pkg_BG_relocation_Pkg(
      BG_in,
      &(*refBGs_in).prevLinkedBG,
      &(*refBGs_in).refBG,
      &sumOfBestDistances,
      trainProperties,
      &relocatedBG);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&relocatedBG, BG_in);
  }
  _L137 = Q_LINK_Unlinked == refBG.q_link;
  /* 17 */ if (BGin_is_refBG & _L106) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&tmp, &refBG);
  }
  else /* 18 */ if (_L96) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp,
      &(*refBGs_in).prevLinkedBG);
    /* 2 */
    sub_2_distances_BasicLocationFunctions_Pkg(
      &refBG.location,
      &_L302,
      &tmp.location);
  }
  else /* 19 */ if (Q_LINK_Linked == relocatedBG.q_link) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&tmp, &relocatedBG);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp,
      &(*refBGs_in).prevLinkedBG);
  }
  kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
    &(*refBGs_out).prevLinkedBG,
    &tmp);
  /* 20 */ if (BGin_is_refBG & _L137) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&tmp, &refBG);
  }
  else /* 21 */ if (BGin_is_refBG & !_L137 & refBG.infoFromPassing.valid &
    (*refBGs_in).prevUnlinkedBG.valid &
    (*refBGs_in).prevUnlinkedBG.infoFromPassing.valid) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp,
      &(*refBGs_in).prevUnlinkedBG);
    /* 3 */
    sub_2_odoDistances_BasicLocationFunctions_Pkg(
      &refBG.infoFromPassing.BG_Header.bgPosition.odo,
      &(*refBGs_in).prevUnlinkedBG.infoFromPassing.BG_Header.bgPosition.odo,
      &refLocation);
    /* 12 */
    add_2_Distances_BasicLocationFunctions_Pkg(
      &refLocation,
      &(*refBGs_in).prevUnlinkedBG.infoFromPassing.BG_Header.BG_centerDetectionInaccuraccuracies,
      &tmp1);
    /* 3 */
    sub_2_distances_BasicLocationFunctions_Pkg(
      &refBG.location,
      &tmp1,
      &tmp.location);
  }
  else /* 22 */ if (Q_LINK_Unlinked == relocatedBG.q_link) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&tmp, &relocatedBG);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp,
      &(*refBGs_in).prevUnlinkedBG);
  }
  kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
    &(*refBGs_out).prevUnlinkedBG,
    &tmp);
  /* 26 */ if (BGin_is_refBG) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(BG_out, &refBG);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(BG_out, &relocatedBG);
  }
}
/* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr */
void recalculate_BG_locations_astern_itr_CalculateTrainPosition_Pkg_BG_relocation_Pkg(
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr::refBGs_in */ refBGs_T_CalculateTrainPosition_Pkg_BG_relocation_Pkg *refBGs_in,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr::BG_in */ positionedBG_T_TrainPosition_Types_Pck *BG_in,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr::trainProperties */ trainProperties_T_TrainPosition_Types_Pck *trainProperties,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr::refBGs_out */ refBGs_T_CalculateTrainPosition_Pkg_BG_relocation_Pkg *refBGs_out,
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr::BG_out */ positionedBG_T_TrainPosition_Types_Pck *BG_out)
{
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr */
  static LocWithInAcc_T_Obu_BasicTypes_Pkg tmp1;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr */
  static LocWithInAcc_T_Obu_BasicTypes_Pkg tmp;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr::BGin_is_refBG */
  static kcg_bool BGin_is_refBG;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr::refBG */
  static positionedBG_T_TrainPosition_Types_Pck refBG;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr::relocatedBG */
  static positionedBG_T_TrainPosition_Types_Pck relocatedBG;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr::sumOfBestDistances */
  static LocWithInAcc_T_Obu_BasicTypes_Pkg sumOfBestDistances;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr::_L106 */
  static kcg_bool _L106;
  /* CalculateTrainPosition_Pkg::BG_relocation_Pkg::recalculate_BG_locations_astern_itr::_L137 */
  static kcg_bool _L137;
  
  BGin_is_refBG = /* 1 */
    positionedBGs_ids_equal_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
      &(*refBGs_in).refBG,
      BG_in);
  (*refBGs_out).recalculate = BGin_is_refBG | ((*refBGs_in).recalculate &
      (*BG_in).valid);
  /* 13 */ if (BGin_is_refBG) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&refBG, BG_in);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &refBG,
      &(*refBGs_in).refBG);
  }
  kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&(*refBGs_out).refBG, &refBG);
  _L106 = Q_LINK_Linked == refBG.q_link;
  _L137 = (*BG_in).valid & ((*BG_in).q_link == Q_LINK_Linked);
  /* 16 */ if (BGin_is_refBG) {
    kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
      &sumOfBestDistances,
      (LocWithInAcc_T_Obu_BasicTypes_Pkg *)
        &cLocWithInAcc_0_Obu_BasicTypes_Pkg);
  }
  else /* 17 */ if (!(*refBGs_in).prevLinkedBG.valid &
    (*refBGs_in).refBG.valid & ((*refBGs_in).refBG.q_link == Q_LINK_Unlinked) &
    (*refBGs_in).refBG.infoFromPassing.valid & (*BG_in).infoFromPassing.valid &
    _L137) {
    /* 2 */
    sub_2_odoDistances_BasicLocationFunctions_Pkg(
      &(*refBGs_in).refBG.infoFromPassing.BG_Header.bgPosition.odo,
      &(*BG_in).infoFromPassing.BG_Header.bgPosition.odo,
      &tmp1);
    /* 3 */
    sub_2_distances_BasicLocationFunctions_Pkg(
      &(*refBGs_in).sumOfBestDistances,
      &tmp1,
      &sumOfBestDistances);
  }
  else /* 14 */ if (_L137 & (*refBGs_in).prevLinkedBG.valid &
    (*refBGs_in).prevLinkedBG.infoFromLinking.valid) {
    /* 1 */
    sub_2_distances_BasicLocationFunctions_Pkg(
      &(*refBGs_in).sumOfBestDistances,
      &(*refBGs_in).prevLinkedBG.infoFromLinking.d_link,
      &sumOfBestDistances);
  }
  else /* 15 */ if (_L137 & (*refBGs_in).prevLinkedBG.valid &
    !(*refBGs_in).prevLinkedBG.infoFromLinking.valid &
    (*refBGs_in).prevLinkedBG.infoFromPassing.valid &
    (*BG_in).infoFromPassing.valid) {
    /* 1 */
    sub_2_odoDistances_BasicLocationFunctions_Pkg(
      &(*refBGs_in).prevLinkedBG.infoFromPassing.BG_Header.bgPosition.odo,
      &(*BG_in).infoFromPassing.BG_Header.bgPosition.odo,
      &tmp);
    /* 2 */
    sub_2_distances_BasicLocationFunctions_Pkg(
      &(*refBGs_in).sumOfBestDistances,
      &tmp,
      &sumOfBestDistances);
  }
  else {
    kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
      &sumOfBestDistances,
      &(*refBGs_in).sumOfBestDistances);
  }
  kcg_copy_LocWithInAcc_T_Obu_BasicTypes_Pkg(
    &(*refBGs_out).sumOfBestDistances,
    &sumOfBestDistances);
  /* 9 */ if ((*refBGs_in).recalculate) {
    /* 1 */
    recalculate_BG_location_astern_CalculateTrainPosition_Pkg_BG_relocation_Pkg(
      BG_in,
      &(*refBGs_in).prevLinkedBG,
      &(*refBGs_in).refBG,
      &sumOfBestDistances,
      trainProperties,
      &relocatedBG);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&relocatedBG, BG_in);
  }
  _L137 = Q_LINK_Unlinked == refBG.q_link;
  /* 3 */ if (BGin_is_refBG & _L106) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &(*refBGs_out).prevLinkedBG,
      &refBG);
  }
  else /* 4 */ if (BGin_is_refBG & !_L106) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &(*refBGs_out).prevLinkedBG,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  else /* 5 */ if (Q_LINK_Linked == relocatedBG.q_link) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &(*refBGs_out).prevLinkedBG,
      &relocatedBG);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &(*refBGs_out).prevLinkedBG,
      &(*refBGs_in).prevLinkedBG);
  }
  /* 8 */ if (BGin_is_refBG & _L137) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &(*refBGs_out).prevUnlinkedBG,
      &refBG);
  }
  else /* 7 */ if (BGin_is_refBG & !_L137) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &(*refBGs_out).prevUnlinkedBG,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  else /* 6 */ if (Q_LINK_Unlinked == relocatedBG.q_link) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &(*refBGs_out).prevUnlinkedBG,
      &relocatedBG);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &(*refBGs_out).prevUnlinkedBG,
      &(*refBGs_in).prevUnlinkedBG);
  }
  /* 12 */ if (BGin_is_refBG) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(BG_out, &refBG);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(BG_out, &relocatedBG);
  }
}