/* 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);
}
/* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfBG_by_id_itr */
void indexOfBG_by_id_itr_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfBG_by_id_itr::iteratorIndex */ kcg_int iteratorIndex,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfBG_by_id_itr::prevIndex */ kcg_int prevIndex,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfBG_by_id_itr::BG */ positionedBG_T_TrainPosition_Types_Pck *BG,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfBG_by_id_itr::BG_asElementFromBGs */ positionedBG_T_TrainPosition_Types_Pck *BG_asElementFromBGs,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfBG_by_id_itr::cont */ kcg_bool *cont,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfBG_by_id_itr::indexOfBG */ kcg_int *indexOfBG)
{
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::indexOfBG_by_id_itr::_L6 */ kcg_bool _L6;
  
  _L6 = /* 1 */
    positionedBGs_ids_equal_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
      BG,
      BG_asElementFromBGs);
  if (_L6) {
    *indexOfBG = iteratorIndex;
  }
  else {
    *indexOfBG = prevIndex;
  }
  *cont = !_L6;
}
/* 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);
  }
}
/* CalculateTrainPosition_Pkg::BG_utilities_Pkg::insertBG_atIndex */
void insertBG_atIndex_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::insertBG_atIndex::BG */positionedBG_T_TrainPosition_Types_Pck *BG,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::insertBG_atIndex::BGs_in */positionedBGs_T_TrainPosition_Types_Pck *BGs_in,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::insertBG_atIndex::indexOfBG */kcg_int indexOfBG,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::insertBG_atIndex::insert */kcg_bool insert,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::insertBG_atIndex::BGs_out */positionedBGs_T_TrainPosition_Types_Pck *BGs_out,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::insertBG_atIndex::overrun */kcg_bool *overrun)
{
  static positionedBG_T_TrainPosition_Types_Pck tmp2;
  static positionedBGs_T_TrainPosition_Types_Pck tmp1;
  static kcg_bool tmp;
  static kcg_int i;
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::insertBG_atIndex::_L12 */
  static array__131293 _L12;
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::insertBG_atIndex::_L15 */
  static array__129125 _L15;
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::insertBG_atIndex::_L16 */
  static kcg_int _L16;
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::insertBG_atIndex::_L34 */
  static kcg_bool _L34;
  
  if ((0 <= indexOfBG) & (indexOfBG < 41)) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp2,
      &(*BGs_in)[indexOfBG]);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &tmp2,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  tmp = /* 1 */
    positionedBGs_ids_equal_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
      &tmp2,
      BG);
  *overrun = !tmp & (*BGs_in)[40].valid;
  _L34 = insert & (indexOfBG >= 0) & (indexOfBG <
      cMaxNoOfStoredBGs_TrainPosition_Types_Pck) & (*BG).valid & !*overrun;
  kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
    &_L12[0],
    (positionedBG_T_TrainPosition_Types_Pck *)
      &cNoPositionedBG_CalculateTrainPosition_Pkg);
  if (tmp) {
    kcg_copy_positionedBGs_T_TrainPosition_Types_Pck(&tmp1, BGs_in);
  }
  else {
    kcg_copy_array__131293(&tmp1[0], &_L12);
    kcg_copy_array__137060(&tmp1[1], (array__137060 *) &(*BGs_in)[0]);
  }
  if (_L34) {
    for (i = 0; i < 41; i++) {
      /* 1 */
      insertBG_atIndex_itr_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
        i,
        indexOfBG,
        BG,
        &(*BGs_in)[i],
        &tmp1[i],
        &tmp,
        &_L15[i]);
      _L16 = i + 1;
      if (!tmp) {
        break;
      }
    }
  }
  else {
    _L16 = 0;
  }
#ifdef KCG_MAPW_CPY
  
  for (i = _L16; i < 41; i++) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &_L15[i],
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
#endif /* KCG_MAPW_CPY */
  
  if (_L34) {
    kcg_copy_positionedBGs_T_TrainPosition_Types_Pck(BGs_out, &_L15);
  }
  else {
    kcg_copy_positionedBGs_T_TrainPosition_Types_Pck(BGs_out, BGs_in);
  }
}
/* CalculateTrainPosition_Pkg::BG_utilities_Pkg::lastAndPrevBG */
void lastAndPrevBG_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::lastAndPrevBG::BG */ positionedBG_T_TrainPosition_Types_Pck *BG,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::lastAndPrevBG::BGs */ positionedBGs_T_TrainPosition_Types_Pck *BGs,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::lastAndPrevBG::linked */ kcg_bool linked,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::lastAndPrevBG::reset */ kcg_bool reset,
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::lastAndPrevBG::enable */ kcg_bool enable,
  outC_lastAndPrevBG_CalculateTrainPosition_Pkg_BG_utilities_Pkg *outC)
{
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::lastAndPrevBG */
  static Q_LINK tmp;
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::lastAndPrevBG::_L10 */
  static positionedBG_T_TrainPosition_Types_Pck _L10;
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::lastAndPrevBG::_L17 */
  static positionedBG_T_TrainPosition_Types_Pck _L17;
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::lastAndPrevBG::_L23 */
  static kcg_bool _L23;
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::lastAndPrevBG::_L22 */
  static kcg_bool _L22;
  /* CalculateTrainPosition_Pkg::BG_utilities_Pkg::lastAndPrevBG::_L21 */
  static kcg_int _L21;
  
  /* last_init_ck_storedBG_loc */ if (outC->init) {
    outC->init = kcg_false;
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &_L10,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &_L17,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&_L10, &outC->prvBG_loc);
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&_L17, &outC->lastBG);
  }
  /* 1 */ if (reset) {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &outC->lastBG,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &outC->prvBG_loc,
      (positionedBG_T_TrainPosition_Types_Pck *)
        &cNoPositionedBG_CalculateTrainPosition_Pkg);
  }
  else {
    /* 2 */ if (linked) {
      tmp = Q_LINK_Linked;
    }
    else {
      tmp = Q_LINK_Unlinked;
    }
    /* 4 */ if ((*BG).valid & (*BG).infoFromPassing.valid &
      (*BG).infoFromPassing.BG_Header.valid & ((*BG).q_link == tmp)) {
      kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&outC->lastBG, BG);
    }
    else {
      kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&outC->lastBG, &_L17);
    }
    _L23 = /* 1 */
      positionedBGs_ids_equal_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
        &outC->lastBG,
        &_L10);
    _L22 = /* 2 */
      positionedBGs_ids_equal_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
        &outC->lastBG,
        &_L17);
    /* 4 */ if (!kcg_comp_positionedBG_T_TrainPosition_Types_Pck(
        &_L17,
        &outC->lastBG) & outC->lastBG.valid & !_L23 & !_L22) {
      kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&outC->prvBG_loc, &_L17);
    }
    else {
      kcg_copy_positionedBG_T_TrainPosition_Types_Pck(&outC->prvBG_loc, &_L10);
    }
  }
  /* 1 */
  indexOfBG_by_id_CalculateTrainPosition_Pkg_BG_utilities_Pkg(
    &outC->prvBG_loc,
    BGs,
    enable,
    &_L21,
    &_L22,
    &_L23);
  /* 1 */ if (_L22) {
    if ((0 <= _L21) & (_L21 < 41)) {
      kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
        &outC->prvBG,
        &(*BGs)[_L21]);
    }
    else {
      kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
        &outC->prvBG,
        (positionedBG_T_TrainPosition_Types_Pck *)
          &cNoPositionedBG_CalculateTrainPosition_Pkg);
    }
  }
  else {
    kcg_copy_positionedBG_T_TrainPosition_Types_Pck(
      &outC->prvBG,
      &outC->prvBG_loc);
  }
}