[Feature][Modem]Update MTK MODEM V1.6 baseline version: MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6

MTK modem version: MT2735_IVT_MOLY.NR15.R3.MD700.IVT.MP1MR3.MP.V1.6.tar.gz
RF  modem version: NA

Change-Id: I45a4c2752fa9d1a618beacd5d40737fb39ab64fb
diff --git a/mcu/tools/vivaConfig.pl b/mcu/tools/vivaConfig.pl
new file mode 100644
index 0000000..e603967
--- /dev/null
+++ b/mcu/tools/vivaConfig.pl
@@ -0,0 +1,2314 @@
+#!/usr/bin/perl

+#

+#  Copyright Statement:

+#  --------------------

+#  This software is protected by Copyright and the information contained

+#  herein is confidential. The software may not be copied and the information

+#  contained herein may not be used or disclosed except with the written

+#  permission of MediaTek Inc. (C) 2006

+#

+#  BY OPENING THIS FILE, BUYER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES

+#  THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")

+#  RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO BUYER ON

+#  AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL WARRANTIES,

+#  EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF

+#  MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR NONINFRINGEMENT.

+#  NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH RESPECT TO THE

+#  SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY, INCORPORATED IN, OR

+#  SUPPLIED WITH THE MEDIATEK SOFTWARE, AND BUYER AGREES TO LOOK ONLY TO SUCH

+#  THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO. MEDIATEK SHALL ALSO

+#  NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE RELEASES MADE TO BUYER'S

+#  SPECIFICATION OR TO CONFORM TO A PARTICULAR STANDARD OR OPEN FORUM.

+#

+#  BUYER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S ENTIRE AND CUMULATIVE

+#  LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE RELEASED HEREUNDER WILL BE,

+#  AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE MEDIATEK SOFTWARE AT ISSUE,

+#  OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE CHARGE PAID BY BUYER TO

+#  MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.

+#

+#  THE TRANSACTION CONTEMPLATED HEREUNDER SHALL BE CONSTRUED IN ACCORDANCE

+#  WITH THE LAWS OF THE STATE OF CALIFORNIA, USA, EXCLUDING ITS CONFLICT OF

+#  LAWS PRINCIPLES.  ANY DISPUTES, CONTROVERSIES OR CLAIMS ARISING THEREOF AND

+#  RELATED THERETO SHALL BE SETTLED BY ARBITRATION IN SAN FRANCISCO, CA, UNDER

+#  THE RULES OF THE INTERNATIONAL CHAMBER OF COMMERCE (ICC).

+#

+#*****************************************************************************

+#*

+#* Filename:

+#* ---------

+#*   vivaConfig.pl

+#*

+#* Project:

+#* --------

+#*   Maui_Software

+#*

+#* Description:

+#* ------------

+#*   This file implemented the VIVA auto configure process

+#*

+#*

+#* Author:

+#* -------

+#*   Ke-Ting Chen (mtk03141)

+#*

+#*****************************************************************************

+

+#****************************************************************************

+# Included Modules

+#****************************************************************************

+use strict;

+use warnings;

+BEGIN { push @INC, "pcore/" , '.\\pcore\\tools\\' }  # add additional library path

+use auto_adjust_mem; #pm file name without case sensitivity

+use File::Copy;

+use File::Basename;

+use vivaHelper;

+

+#****************************************************************************

+# History

+#****************************************************************************

+my $VIVA_CONFIG_VERNO = " v1.03";

+   # v1.03: Phase in ZIMAGE_FAVOR_ROM

+   # v1.02: Phase in BOOT_ZIMAGE

+   # v1.01: Add AUTOCONFIG_SELF_MODIFY_SUCCESS error code support

+   # v1.00: Phase in VIVA

+

+#****************************************************************************

+# Constants

+#****************************************************************************

+my $DEBUG = 1;

+

+# Path

+my $templateFolderPath  = "custom\\system\\Template";

+my $objectListGenFolderPath = "scat_config\\FeatureBased\\ObjListGen";

+

+# Binary

+my $bootZImageBinaryName = "BOOT_ZIMAGE_ER";

+my $zImageBinaryName = "ZIMAGE_ER";

+my $dcmcmpBinaryName = "DYNAMIC_COMP_CODE";

+my $aliceBinaryName = "ALICE";

+

+# Normal scatter

+my $objectROM1ListFileName = "objectROM1.list";

+my $objectBootZImageListFileName = "objectBOOT_ZIMAGE.list";

+my $objectZImageListFileName = "objectZIMAGE.list";

+my $objectAliceListFileName = "objectALICE.list";

+

+# Dummy scatter

+my $objectROM1DummyListFileName = "objectROM1_dummy.list";

+my $objectBootZImageDummyListFileName = "objectBOOT_ZIMAGE_dummy.list";

+my $objectZImageDummyListFileName = "objectZIMAGE_dummy.list";

+my $objectAliceDummyListFileName = "objectALICE_dummy.list";

+my $objectAliceForbidDummyListFileName = "objectALICE_FORBID_dummy.list";

+

+# Alignment

+my $bootZImageSizeAlignment = 256;

+my $zImageSizeAlignment = 256;

+my $dcmcmpSizeAlignment = 256;

+my $aliceSizeAlignment = 256;

+

+my $veneerReserveRatio = 0.05;

+my $smallestSplitableRAMSize = 10240;

+

+my $separateLine = "=============================================================";

+

+use constant CONFIG_FAIL_INSUFFICIENT_RAM => 0;

+use constant CONFIG_FAIL_ZIMAGE_OVERFLOW  => 1;

+use constant CONFIG_FAIL_FEATURE_NOT_ENABLED => 2;

+use constant CONFIG_FAIL_NO_CONFIG_CHANGED => 3;

+use constant CONFIG_FAIL_INSUFFICIENT_FLASH_SIZE => 4;

+use constant CONFIG_FAIL_INSUFFICIENT_RAM_FOR_BOOT_ZIMAGE => 5;

+

+#****************************************************************************

+# Arguments

+#****************************************************************************

+&vivaHelper::ErrorHandler("Insufficient arguments!", __LINE__, __FILE__)

+   unless scalar(@ARGV) == 7;

+

+my $lisFilePath = $ARGV[0];

+my $dummyBinaryFolder = $ARGV[1];

+my $customFolder = $ARGV[2];

+my $makefilePath = $ARGV[3];

+my $flashConfigFilePath = $ARGV[4];

+my $intermediateFilePath = $ARGV[5];

+my $aapmcLogFilePath = $ARGV[6];

+

+# To align error message file name format

+$lisFilePath =~ s/^.\\|^\\//;

+$dummyBinaryFolder =~ s/^.\\|^\\//;

+$customFolder   =~ s/^.\\|^\\//;

+$makefilePath =~ s/^.\\|^\\//;

+$flashConfigFilePath =~ s/^.\\|^\\//;

+$intermediateFilePath =~ s/^.\\|^\\//;

+$aapmcLogFilePath =~ s/^.\\|^\\//;

+

+# Print out the arguments

+printLog($separateLine);

+printLog("Arguments:");

+printLog("LIS File: $lisFilePath");

+printLog("Dummy Binary Folder: $dummyBinaryFolder");

+printLog("Custom Folder: $customFolder");

+printLog("Makefile: $makefilePath");

+printLog("Flash Config File: $flashConfigFilePath");

+printLog("Intermediate File: $intermediateFilePath");

+printLog("");

+

+#****************************************************************************

+# Variables

+#****************************************************************************

+my $objectListFolder = "$customFolder\\$objectListGenFolderPath";

+

+my $featureConfigFilePath = "$customFolder\\custom_FeatureConfig.h";

+

+# Binary

+my $bootZImageBinary = "$dummyBinaryFolder\\$bootZImageBinaryName";

+my $zImageBinary = "$dummyBinaryFolder\\$zImageBinaryName";

+my $dcmcmpBinary = "$dummyBinaryFolder\\$dcmcmpBinaryName";

+my $aliceBinary = "$dummyBinaryFolder\\$aliceBinaryName";

+

+# Normal scatter

+my $objectROM1ListFile = "$objectListFolder\\$objectROM1ListFileName";

+my $objectBootZImageListFile = "$objectListFolder\\$objectBootZImageListFileName";

+my $objectZImageListFile = "$objectListFolder\\$objectZImageListFileName";

+my $objectAliceListFile = "$objectListFolder\\$objectAliceListFileName";

+

+# Dummy scatter

+my $objectROM1DummyListFile = "$objectListFolder\\$objectROM1DummyListFileName";

+my $objectBootZImageDummyListFile = "$objectListFolder\\$objectBootZImageDummyListFileName";

+my $objectZImageDummyListFile = "$objectListFolder\\$objectZImageDummyListFileName";

+my $objectAliceDummyListFile = "$objectListFolder\\$objectAliceDummyListFileName";

+my $objectAliceForbidDummyListFile = "$objectListFolder\\$objectAliceForbidDummyListFileName";

+

+#my $totalLISROMSize;

+my %featureConfig;

+

+# Feature switchs

+my $bootZImageEnabled = 0;

+my $zImageEnabled = 0;

+my $dcmcmpEnabled = 0;

+my $aliceEnabled = 0;

+my $mbaEnabled = 0;

+

+my $zImageFavorROM = 0;

+

+# Output configurations

+my $bootZImageMaxCompressedSize = 0;

+

+my $zImageMaxCompressedSize = 0;

+

+my $dcmcmpMaxCompressedSize = 0;

+my $dcmcmpUsedROM = 0;

+my $dcmcmpUsedRAM = 0;

+

+my $aliceMaxCompressedSize = 0;

+

+# Output object lists

+my @rom1List;

+my @bootZImageList;

+my @zImageList;

+my @aliceList;

+

+# Configure changed

+my $configChanged = 0;

+my $objectListChanged = 0;

+

+#****************************************************************************

+# Initialize

+#****************************************************************************

+printLog($separateLine);

+printLog("[Start initializing stage]");

+

+# Initialize VIVA helper for makefile parsing and LIS parsing

+&vivaHelper::Initialize(vivaHelper::CONFIG_TYPE, $makefilePath, $lisFilePath);

+

+# Check the feature set

+{

+   printLog("Checking feature set...");

+

+   my $bootZImageOption = &vivaHelper::GetMakefileOption("BOOT_ZIMAGE_SUPPORT");

+   my $zImageOption = &vivaHelper::GetMakefileOption("ZIMAGE_SUPPORT");

+   my $dcmcmpOption = &vivaHelper::GetMakefileOption("DCM_COMPRESSION_SUPPORT");

+   my $aliceOption = &vivaHelper::GetMakefileOption("ALICE_SUPPORT");

+   my $mbaOption = &vivaHelper::GetMakefileOption("MULTIPLE_BINARY_FILES");

+

+   my $zImageFavorROMOption = &vivaHelper::GetMakefileOption("ZIMAGE_FAVOR_ROM");

+

+   if (defined $bootZImageOption and $bootZImageOption eq "TRUE")

+   {

+      $bootZImageEnabled = 1;

+      debugLog("BOOT_ZIMAGE is enabled");

+   }

+

+   if (defined $zImageOption and $zImageOption eq "TRUE")

+   {

+      $zImageEnabled = 1;

+      debugLog("ZIMAGE is enabled");

+   }

+

+   if (defined $dcmcmpOption and $dcmcmpOption eq "TRUE")

+   {

+      $dcmcmpEnabled = 1;

+      debugLog("DCM with Compression is enabled");

+   }

+

+   if (defined $aliceOption and $aliceOption eq "TRUE")

+   {

+      $aliceEnabled = 1;

+      debugLog("ALICE is enabled");

+   }

+

+   if (defined $zImageFavorROMOption and $zImageFavorROMOption eq "TRUE")

+   {

+      $zImageFavorROM = 1;

+      debugLog("ZIMAGE_FAVOR_ROM is enabled");

+   }

+

+   if (defined $mbaOption and $mbaOption eq "TRUE")

+   {

+      $mbaEnabled = 1;

+      debugLog("MBA is enabled");

+   }

+

+   &configFail(CONFIG_FAIL_FEATURE_NOT_ENABLED)

+      unless $zImageEnabled or $bootZImageEnabled or $aliceEnabled or $dcmcmpEnabled;

+}

+

+# Parse feature config file

+printLog("Parsing feature configuration file");

+&parseFeatureConfigFile(\%featureConfig);

+

+printLog("[End initializing stage]\n");

+

+#****************************************************************************

+# Configure

+#****************************************************************************

+printLog($separateLine);

+printLog("[Start configuration stage]");

+

+# Note DCMCMP should be configured before BOOT_ZIMAGE, ZIMAGE, and ALICE

+if($dcmcmpEnabled)

+{

+   $configChanged = &configDcmcmp() || $configChanged;

+}

+

+printLog("");

+

+if ($bootZImageEnabled and $zImageEnabled and $aliceEnabled)

+{

+   my ($configChangedTemp, $objectListChangedTemp);

+   if ($zImageFavorROM)

+   {

+      ($configChangedTemp, $objectListChangedTemp) = configBootZImage_ZImage_Alice_FavorROM();

+   }

+   else

+   {

+      ($configChangedTemp, $objectListChangedTemp) = configBootZImage_ZImage_Alice();

+   }

+   $configChanged = $configChangedTemp || $configChanged;

+   $objectListChanged = $objectListChangedTemp || $objectListChanged;

+}

+elsif ($zImageEnabled and $aliceEnabled)

+{

+   my ($configChangedTemp, $objectListChangedTemp);

+

+   if ($zImageFavorROM)

+   {

+      ($configChangedTemp, $objectListChangedTemp) = configZImage_Alice_FavorROM();

+   }

+   else

+   {

+      ($configChangedTemp, $objectListChangedTemp) = configZImage_Alice();

+   }

+   $configChanged = $configChangedTemp || $configChanged;

+   $objectListChanged = $objectListChangedTemp || $objectListChanged;

+}

+elsif ($zImageEnabled)

+{

+   my ($configChangedTemp, $objectListChangedTemp);

+

+   if ($zImageFavorROM)

+   {

+      ($configChangedTemp, $objectListChangedTemp) = configZImage_FavorROM();

+   }

+   else

+   {

+      ($configChangedTemp, $objectListChangedTemp) = configZImage();

+   }

+   $configChanged = $configChangedTemp || $configChanged;

+   $objectListChanged = $objectListChangedTemp || $objectListChanged;

+}

+elsif ($aliceEnabled)

+{

+   $configChanged = &configAlice() || $configChanged;

+}

+else

+{

+   #&configFail(CONFIG_FAIL_FEATURE_NOT_ENABLED);

+}

+

+printLog("[End configuration stage]\n");

+

+#****************************************************************************

+# Output

+#****************************************************************************

+printLog($separateLine);

+printLog("[Start output stage]");

+

+my $outputMessage;

+my %changeList;

+my $result;

+

+# Get original settings

+{

+   $outputMessage = "[Before auto adjustment]\n";

+

+   if ($zImageEnabled)

+   {

+      my $zImageMaxCompressedSizeOriginal = &vivaHelper::DecToHex($featureConfig{"CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE"});

+      $outputMessage .= "CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE=$zImageMaxCompressedSizeOriginal\n";

+   }

+

+   if ($bootZImageEnabled)

+   {

+      my $bootZImageMaxCompressedSizeOriginal = &vivaHelper::DecToHex($featureConfig{"CONFIG_BOOT_ZIMAGE_MAX_COMPRESSED_SIZE"});

+      $outputMessage .= "CONFIG_BOOT_ZIMAGE_MAX_COMPRESSED_SIZE=$bootZImageMaxCompressedSizeOriginal\n";

+   }

+

+   if ($dcmcmpEnabled)

+   {

+      my $dcmcmpMaxCompressedSizeOriginal = &vivaHelper::DecToHex($featureConfig{"CONFIG_DCMP_MAX_COMPRESSED_SIZE"});

+      $outputMessage .= "CONFIG_DCMP_MAX_COMPRESSED_SIZE=$dcmcmpMaxCompressedSizeOriginal\n";

+   }

+

+   if ($aliceEnabled)

+   {

+      my $aliceMaxCompressedSizeOriginal = &vivaHelper::DecToHex($featureConfig{"CONFIG_ALICE_MAX_COMPRESSED_SIZE"});

+      $outputMessage .= "CONFIG_ALICE_MAX_COMPRESSED_SIZE=$aliceMaxCompressedSizeOriginal\n";

+   }

+}

+

+# Get new settings and change list

+{

+   $outputMessage .= "[After auto adjustment]\n";

+

+   if ($zImageEnabled)

+   {

+      my $zImageMaxCompressedSizeHex = &vivaHelper::DecToHex($zImageMaxCompressedSize);

+      $outputMessage .= "CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE=$zImageMaxCompressedSizeHex\n";

+      $changeList{"CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE"} = $zImageMaxCompressedSizeHex;

+   }

+

+   if ($bootZImageEnabled)

+   {

+      my $bootZImageMaxCompressedSizeHex = &vivaHelper::DecToHex($bootZImageMaxCompressedSize);

+      $outputMessage .= "CONFIG_BOOT_ZIMAGE_MAX_COMPRESSED_SIZE=$bootZImageMaxCompressedSizeHex\n";

+      $changeList{"CONFIG_BOOT_ZIMAGE_MAX_COMPRESSED_SIZE"} = $bootZImageMaxCompressedSizeHex;

+   }

+

+   if ($dcmcmpEnabled)

+   {

+      my $dcmcmpMaxCompressedSizeHex = &vivaHelper::DecToHex($dcmcmpMaxCompressedSize);

+      $outputMessage .= "CONFIG_DCMP_MAX_COMPRESSED_SIZE=$dcmcmpMaxCompressedSizeHex\n";

+      $changeList{"CONFIG_DCMP_MAX_COMPRESSED_SIZE"} = $dcmcmpMaxCompressedSizeHex;

+   }

+

+   if ($aliceEnabled)

+   {

+      my $aliceMaxCompressedSizeHex = &vivaHelper::DecToHex($aliceMaxCompressedSize);

+      $outputMessage .= "CONFIG_ALICE_MAX_COMPRESSED_SIZE=$aliceMaxCompressedSizeHex\n";

+      $changeList{"CONFIG_ALICE_MAX_COMPRESSED_SIZE"} = $aliceMaxCompressedSizeHex;

+   }

+}

+

+printLog("Configuration results:");

+printLog($outputMessage);

+

+if (&isAutoConfigEnable())

+{

+   printLog("Auto adjusting...");

+

+   if ($configChanged)

+   {

+      $result = &AAPMCLogParser::Open($aapmcLogFilePath);

+

+      if (ERR::AAPMCLOG_SUCCESS != $result)

+      {

+         printLog("Cannot open AAPMC log parser!");

+         return $result;

+      }

+      else

+      {

+         my $p4InfoRef = &AUTO_ADJUST::CreateP4InfoTemplate("mtk03141", "", "VIVA auto config", $outputMessage);

+         my $aapmcResult;

+

+         $result = &AAPMCLogParser::AddOneChangeRecord($featureConfigFilePath, \%changeList, \%$p4InfoRef);

+

+         if (ERR::AAPMCLOG_SUCCESS == $result)

+         {

+            printLog("Modification succeeded!");

+            &printIntermediateFile($outputMessage);

+         }

+         elsif (ERR::ERR_MODIFYDUPLICATED == $result)

+         {

+            printLog("Modification duplicated!");

+         }

+         else

+         {

+            printLog("Modification failed!");

+         }

+

+         $aapmcResult = &AAPMCLogParser::Close($aapmcLogFilePath);

+

+         if (ERR::AAPMCLOG_SUCCESS != $aapmcResult)

+         {

+            printLog("Cannot close AAPMC log parser!");

+            return $aapmcResult;

+         }

+      }

+   }

+   else

+   {

+      # Only object lists are changed

+      $result = ERR::AUTOCONFIG_SELF_MODIFY_SUCCESS;

+      &printIntermediateFile($outputMessage);

+   }

+

+   if ($objectListChanged)

+   {

+      printLog("Adjusting object list");

+

+      debugLog("Adjust ROM1 object list");

+      &backupFile($objectROM1ListFile);

+      &vivaHelper::SortObjectList(\@rom1List);

+      &vivaHelper::OutputObjectListToFile($objectROM1ListFile, \@rom1List);

+

+      if ($bootZImageEnabled)

+      {

+         debugLog("Adjust BOOT_ZIMAGE object list");

+         &backupFile($objectBootZImageListFile);

+         &vivaHelper::SortObjectList(\@bootZImageList);

+         &vivaHelper::OutputObjectListToFile($objectBootZImageListFile, \@bootZImageList);

+      }

+

+      if ($zImageEnabled)

+      {

+         debugLog("Adjust ZIMAGE object list");

+         &backupFile($objectZImageListFile);

+         &vivaHelper::SortObjectList(\@zImageList);

+         &vivaHelper::OutputObjectListToFile($objectZImageListFile, \@zImageList);

+      }

+

+      if ($aliceEnabled)

+      {

+         debugLog("Adjust ALICE object list");

+         &backupFile($objectAliceListFile);

+         &vivaHelper::SortObjectList(\@aliceList);

+         &vivaHelper::OutputObjectListToFile($objectAliceListFile, \@aliceList);

+      }

+

+      printLog("Adjusting object list done");

+   }

+}

+else

+{

+   &printIntermediateFile($outputMessage);

+   $result = ERR::NO_MODIFY;

+}

+

+printLog("Result: $result");

+printLog("[End output stage]");

+exit $result;

+

+#****************************************************************************

+# subroutine:  configDcmcmp

+# description: Perform the DCMCMP configuration

+# input:       None

+# output:      DCMCMP max compressed size, changed,

+#              DCMCMP used ROM size, DCMCMP used RAM size

+#****************************************************************************

+sub configDcmcmp

+{

+   printLog("Configuring DCMCMP...");

+

+   # Assumption: same category should be put together

+   my @dcmcmpRegionInfo = (

+   # feature name                   category            load region                 on value

+   #['BT_AUDIO_VIA_SCO',             'SharePool1',       'DYNAMIC_COMP_RESAMPLE',    'TRUE'],

+   ['BT_A2DP_PROFILE',              'SharePool1',       'DYNAMIC_COMP_SBC',         'TRUE'],

+   ['BES_LOUDNESS_SUPPORT',         'SharePool2',       'DYNAMIC_COMP_BESLOUDNESS', 'TRUE'],

+   ['MP4_DECODE',                   'SharePool3',       'DYNAMIC_COMP_MP4DEC',      'SP'],

+   ['H264_DECODE',                  'SharePool3',       'DYNAMIC_COMP_H264DEC',     'TRUE'],

+   ['MP4_ENCODE',                   'SharePool3',       'DYNAMIC_COMP_MP4ENC',      'TRUE'],

+   ['MP4_DECODE_PROFILE',           'SharePool3',       'DYNAMIC_COMP_MP4ASPDEC',   'ASP'],

+   ['VP8_DECODE',                   'SharePool3',       'DYNAMIC_COMP_VP8DEC',      'TRUE'],

+   ['VIDEO_PLAYER_RECORDER_W_DCM',  'SharePool4',       'DYNAMIC_COMP_VEENC',       'TRUE'],

+   ['VIDEO_PLAYER_RECORDER_W_DCM',  'SharePool4',       'DYNAMIC_COMP_VEDEC',       'TRUE'],

+   ['DAF_DECODE',                   'SharePool5',       'DYNAMIC_COMP_DAF',         'TRUE'],

+   ['MELODY_VER',                   'SharePool5',       'DYNAMIC_COMP_WAVETABLE',   'DSP_WT_SYN'],

+   );

+   use constant FEATURE_NAME => 0;

+   use constant CATEGORY => 1;

+   use constant LOAD_REGION => 2;

+   use constant ON_VALUE => 3;

+

+   my %regionInfo;

+   my $currentCategory = $dcmcmpRegionInfo[0][CATEGORY];

+   my $categoryMaxRAM = 0;

+

+   # Get the actual size

+   foreach my $region (@dcmcmpRegionInfo)

+   {

+      my $option = &vivaHelper::GetMakefileOption($region->[FEATURE_NAME]);

+      if (defined $option and $option eq $region->[ON_VALUE])

+      {

+         my %regionSize;

+

+         &vivaHelper::GetLISLoadRegionInfo($region->[LOAD_REGION], \%regionInfo);

+

+         $dcmcmpUsedROM += $regionInfo{"max_size"};

+

+         debugLog("$region->[FEATURE_NAME], $region->[CATEGORY], $region->[LOAD_REGION], $region->[ON_VALUE], $regionInfo{max_size}");

+

+         if ($currentCategory ne $region->[CATEGORY])

+         {

+            $dcmcmpUsedRAM += $categoryMaxRAM;

+            $categoryMaxRAM = $regionInfo{"max_size"};

+            $currentCategory = $region->[CATEGORY];

+         }

+         elsif ($categoryMaxRAM < $regionInfo{"max_size"})

+         {

+            $categoryMaxRAM = $regionInfo{"max_size"};

+         }

+      }

+   }

+

+   # Last category used RAM

+   $dcmcmpUsedRAM += $categoryMaxRAM;

+

+   # Get the compressed size

+   $dcmcmpMaxCompressedSize = -s $dcmcmpBinary or

+         &vivaHelper::ErrorHandler("Cannot get file size $dcmcmpBinary: $!", __FILE__, __LINE__);

+

+   $dcmcmpMaxCompressedSize =

+      &vivaHelper::RoundUpToAlignment($dcmcmpMaxCompressedSize, $dcmcmpSizeAlignment);

+

+   debugLog("Used ROM: $dcmcmpUsedROM");

+   debugLog("Used RAM: $dcmcmpUsedRAM");

+   printLog("DCMCMP Max Compressed Size: ".vivaHelper::DecToHex($dcmcmpMaxCompressedSize));

+

+   # Check whether the cofiguration is changed

+   if ($featureConfig{"CONFIG_DCMP_MAX_COMPRESSED_SIZE"} == $dcmcmpMaxCompressedSize)

+   {

+      debugLog("DCMCMP config not changed");

+      return 0;

+   }

+   else

+   {

+      debugLog("DCMCMP config changed");

+      return 1;

+   }

+}

+

+sub configBootZImage_ZImage_Alice

+{

+   printLog("Configuring BOOT_ZIMAGE, ZIMAGE, and ALICE...");

+

+   my $rom1RegionSize;

+   my $bootZImageRegionSize;

+   my $zImageRegionSize;

+   my $aliceRegionSize;

+

+   my @bootZImageDummyList;

+   my @aliceForbidDummyList;

+   my @anyCodeDummyList;

+   my @anyDataDummyList;

+

+   my $bootZImageDummyRegionPadding;

+   my $aliceForbidDummyRegionPadding;

+   my $anyCodeDummyRegionPadding;

+   my $anyDataDummyRegionPadding;

+

+   my $rom1DummyRegionSize;

+   my $bootZImageDummyRegionSize;

+   my $zImageDummyRegionSize;

+   my $aliceDummyRegionSize;

+   my $aliceForbidDummyRegionSize;

+   my $anyCodeDummyRegionSize;

+   my $anyDataDummyRegionSize;

+

+   my $freeRAMSize;

+

+   my $availableRAM;

+

+   my %variables =

+      (

+       '$dcmcmpUsedRAM' => ["DCMCMP Used RAM", \$dcmcmpUsedRAM],

+       '$veneerReserveRatio' => ["Veneer Reserve Ratio", \$veneerReserveRatio],

+       '$rom1RegionSize' => ["ROM1 Region Size", \$rom1RegionSize],

+       '$bootZImageRegionSize' => ["BOOT_ZIMAGE Region Size", \$bootZImageRegionSize],

+       '$zImageRegionSize' => ["ZIMAGE Region Size", \$zImageRegionSize],

+       '$aliceRegionSize' => ["ALICE Region Size", \$aliceRegionSize],

+       '$bootZImageDummyRegionPadding' => ["BOOT_ZIMAGE Dummy Region Padding", \$bootZImageDummyRegionPadding],

+       '$aliceForbidDummyRegionPadding' => ["ALICE_FORBID Dummy Region Padding", \$aliceForbidDummyRegionPadding],

+       '$anyCodeDummyRegionPadding' => ["ANY_CODE Dummy Region Padding", \$anyCodeDummyRegionPadding],

+       '$anyDataDummyRegionPadding' => ["ANY_DATA Dummy Region Padding", \$anyDataDummyRegionPadding],

+       '$rom1DummyRegionSize' => ["ROM1 Dummy Region Size", \$rom1DummyRegionSize],

+       '$bootZImageDummyRegionSize' => ["BOOT_ZIMAGE Dummy Region Size", \$bootZImageDummyRegionSize],

+       '$zImageDummyRegionSize' => ["ZIMAGE Dummy Region Size", \$zImageDummyRegionSize],

+       '$aliceDummyRegionSize' => ["ALICE Dummy Region Size", \$aliceDummyRegionSize],

+       '$aliceForbidDummyRegionSize' => ["ALICE_FORBID Dummy Region Size", \$aliceForbidDummyRegionSize],

+       '$anyCodeDummyRegionSize' => ["ANY_CODE Dummy Region Size", \$anyCodeDummyRegionSize],

+       '$anyDataDummyRegionSize' => ["ANY_DATA Dummy Region Size", \$anyDataDummyRegionSize],

+       '$freeRAMSize' => ["Free RAM Size", \$freeRAMSize],

+       '$availableRAM' => ["Available RAM", \$availableRAM],

+      );

+

+   my %objectLists =

+      (

+       '@rom1List' => ["ROM1 List", \@rom1List, '$rom1RegionSize',],

+       '@bootZImageList' => ["BOOT_ZIMAGE List", \@bootZImageList, '$bootZImageRegionSize',],

+       '@zImageList' => ["ZIMAGE List", \@zImageList, '$zImageRegionSize',],

+       '@aliceList' => ["ALICE List", \@aliceList, '$aliceRegionSize',],

+       '@bootZImageDummyList' => ["BOOT_ZIMAGE Dummy List", \@bootZImageDummyList, '$bootZImageDummyRegionSize', '$bootZImageDummyRegionPadding'],

+       '@aliceForbidDummyList' => ["ALICE_FORBID Dummy List", \@aliceForbidDummyList, '$aliceForbidDummyRegionSize', '$aliceForbidDummyRegionPadding'],

+       '@anyCodeDummyList' => ["ANY_CODE Dummy List", \@anyCodeDummyList, '$anyCodeDummyRegionSize', '$anyCodeDummyRegionPadding'],

+       '@anyDataDummyList' => ["ANY_DATA Dummy List", \@anyDataDummyList, '$anyDataDummyRegionSize', '$anyDataDummyRegionPadding']

+      );

+

+   printLog("Get dummy scatter object lists");

+   {

+      # Basic

+      &_inputObjectListFromFile($objectROM1DummyListFile, \@rom1List, "ROM1");

+      &_inputObjectListFromFile($objectBootZImageDummyListFile, \@bootZImageList, "BOOT_ZIMAGE");

+      &_inputObjectListFromFile($objectZImageDummyListFile, \@zImageList, "ZIMAGE");

+      &_inputObjectListFromFile($objectAliceDummyListFile, \@aliceList, "ALICE");

+

+      # To be added

+      $bootZImageDummyRegionPadding = &_inputObjectListFromExecutionRegion("BOOT_ZIMAGE_ER", \@bootZImageDummyList, "+RO", "BOOT_ZIMAGE list");

+      $aliceForbidDummyRegionPadding = &_inputObjectListFromExecutionRegion("ALICE_FORBID", \@aliceForbidDummyList, "+RO", "ALICE_FORBID list");

+      $anyCodeDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_CODE", \@anyCodeDummyList, "+RO-CODE", "ANY_CODE list");

+      $anyDataDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_DATA", \@anyDataDummyList, "+RO-DATA", "ANY_DATA list");

+   }

+

+   printLog("Get size information");

+   {

+      $rom1DummyRegionSize = &_getExecutionRegionInfo("ROM1", "actual_size");

+      $bootZImageDummyRegionSize = &_getExecutionRegionInfo("BOOT_ZIMAGE_ER", "actual_size");

+      $zImageDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_ER", "actual_size");

+      $aliceDummyRegionSize = &_getExecutionRegionInfo("ALICE", "actual_size");

+      $aliceForbidDummyRegionSize = &_getExecutionRegionInfo("ALICE_FORBID", "actual_size");

+      $anyCodeDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_CODE", "actual_size");

+      $anyDataDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_DATA", "actual_size");

+

+      $rom1RegionSize = $rom1DummyRegionSize;

+      $bootZImageRegionSize = $bootZImageDummyRegionSize;

+      $zImageRegionSize = $zImageDummyRegionSize;

+      $aliceRegionSize = $aliceDummyRegionSize;

+

+      $freeRAMSize = &getFreeRAMSize();

+   }

+

+   # Configure

+   {

+      printLog("Compute Available RAM");

+

+      &_evaluateAssignment('$availableRAM = ($freeRAMSize - $dcmcmpUsedRAM - $zImageDummyRegionSize) * (1 - $veneerReserveRatio)', \%variables);

+      $availableRAM = int($availableRAM);

+

+      if ($availableRAM < 0)

+      {

+         &configFail(CONFIG_FAIL_INSUFFICIENT_RAM, -1 * $availableRAM);

+      }

+      elsif ($availableRAM < $anyDataDummyRegionSize + $aliceForbidDummyRegionSize)

+      {

+         &configFail(CONFIG_FAIL_INSUFFICIENT_RAM_FOR_BOOT_ZIMAGE, $anyDataDummyRegionSize + $aliceForbidDummyRegionSize - $availableRAM);

+      }

+

+      # When BOOT_ZIMAGE enabled, all ALICE_FORBID and ANY_DATA list should be in ZIMAGE

+      printLog("Push ALICE_FORBID List and ANY_DATA List to ZIMAGE");

+      {

+         &_pushToObjectList('@zImageList', '@aliceForbidDummyList', \%variables, \%objectLists);

+         &_pushToObjectList('@zImageList', '@anyDataDummyList', \%variables, \%objectLists);

+

+         &_evaluateAssignment('$availableRAM = $availableRAM - ($aliceForbidDummyRegionSize + $anyDataDummyRegionSize)', \%variables);

+      }

+

+      # The rest RAM size is then used by BOOT_ZIMAGE

+      printLog("Push BOOT_ZIMAGE");

+      if ($availableRAM >= $bootZImageDummyRegionSize)

+      {

+         debugLog("Available RAM >= BOOT_ZIMAGE_ER size");

+

+         # All BOOT_ZIMAGE region can be put in RAM

+         # No change of BOOT_ZIMAGE object list

+         debugLog("BOOT_ZIMAGE list = BOOT_ZIMAGE dummy list");

+         debugLog("BOOT_ZIMAGE region size = BOOT_ZIMAGE dummy size = $bootZImageDummyRegionSize");

+

+         &_evaluateAssignment('$availableRAM = $availableRAM - $bootZImageDummyRegionSize', \%variables);

+      }

+      else

+      {

+         debugLog("Available RAM < BOOT_ZIMAGE_ER size");

+

+         # Should split BOOT_ZIMAGE dummy list

+         &vivaHelper::ChangeObjectListAttributeListByObjectList(\@bootZImageDummyList, \@bootZImageList);

+         @bootZImageList = ();

+         $bootZImageRegionSize = 0;

+

+         &_splitObjectListAndPush('@bootZImageDummyList', '@bootZImageList', '@rom1List',

+                                  '$availableRAM', \%variables, \%objectLists);

+

+         if (0 == scalar(@bootZImageList))

+         {

+            &configFail(CONFIG_FAIL_INSUFFICIENT_RAM_FOR_BOOT_ZIMAGE, $bootZImageDummyList[-1]->{"size"});

+         }

+

+         $availableRAM = 0;

+         debugLog("Available RAM = 0");

+      }

+

+      # Finally, the rest RAM is used by ZIMAGE for ANY_CODE

+      printLog("Push ANY_CODE to ZIMAGE and ALICE");

+      {

+         &_splitObjectListAndPushByAvailableRAM('@anyCodeDummyList', '@zImageList', '@aliceList',

+                                                \%variables, \%objectLists);

+      }

+

+      printLog("Compute the Max Compressed Size");

+      {

+         $bootZImageMaxCompressedSize = &_getRegionMaxCompressedSize("BOOT_ZIMAGE", $bootZImageRegionSize, $bootZImageDummyRegionSize, $bootZImageBinary);

+         $zImageMaxCompressedSize = &_getRegionMaxCompressedSize("ZIMAGE", $zImageRegionSize, $zImageDummyRegionSize + $anyCodeDummyRegionSize + $anyDataDummyRegionSize, $zImageBinary);

+         $aliceMaxCompressedSize = &_getRegionMaxCompressedSize("ALICE", $aliceRegionSize, $aliceDummyRegionSize, $aliceBinary);

+      }

+

+      $bootZImageMaxCompressedSize =

+         &vivaHelper::RoundUpToAlignment($bootZImageMaxCompressedSize, $bootZImageSizeAlignment);

+      $zImageMaxCompressedSize =

+         &vivaHelper::RoundDownToAlignment($zImageMaxCompressedSize, $zImageSizeAlignment);

+      $aliceMaxCompressedSize =

+         &vivaHelper::RoundUpToAlignment($aliceMaxCompressedSize, $aliceSizeAlignment);

+

+      printLog("BOOT_ZIMAGE Max Compressed Size: ".vivaHelper::DecToHex($bootZImageMaxCompressedSize));

+      printLog("ZIMAGE Max Compressed Size: ".vivaHelper::DecToHex($zImageMaxCompressedSize));

+      printLog("ALICE Max Compressed Size: ".vivaHelper::DecToHex($aliceMaxCompressedSize));

+   }

+

+   # Check whether the configurations are changed

+   {

+      if ($featureConfig{"CONFIG_BOOT_ZIMAGE_MAX_COMPRESSED_SIZE"} == $bootZImageMaxCompressedSize and

+          $featureConfig{"CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE"} == $zImageMaxCompressedSize and

+          $featureConfig{"CONFIG_ALICE_MAX_COMPRESSED_SIZE"} == $aliceMaxCompressedSize)

+      {

+         debugLog("Config not changed");

+         $configChanged = 0;

+      }

+      else

+      {

+         debugLog("Config changed");

+         $configChanged = 1;

+      }

+

+      if (&_isObjectListChanged($objectROM1ListFile, \@rom1List) or

+          &_isObjectListChanged($objectBootZImageListFile, \@bootZImageList) or

+          &_isObjectListChanged($objectZImageListFile, \@zImageList) or

+          &_isObjectListChanged($objectAliceListFile, \@aliceList))

+      {

+         debugLog("Object list changed");

+         $objectListChanged = 1;

+      }

+      else

+      {

+         debugLog("Object list not changed");

+         $objectListChanged = 0;

+      }

+   }

+

+   return ($configChanged, $objectListChanged);

+}

+

+sub configZImage_Alice

+{

+   printLog("Configuring ZIMAGE and ALICE...");

+

+   my $rom1RegionSize;

+   my $zImageRegionSize;

+   my $aliceRegionSize;

+

+   my @aliceForbidDummyList;

+   my @anyCodeDummyList;

+   my @anyDataDummyList;

+

+   my $aliceForbidDummyRegionPadding;

+   my $anyCodeDummyRegionPadding;

+   my $anyDataDummyRegionPadding;

+

+   my $rom1DummyRegionSize;

+   my $zImageDummyRegionSize;

+   my $aliceDummyRegionSize;

+   my $aliceForbidDummyRegionSize;

+   my $anyCodeDummyRegionSize;

+   my $anyDataDummyRegionSize;

+

+   my $freeRAMSize;

+

+   my $availableRAM;

+

+   my %variables =

+      (

+       '$dcmcmpUsedRAM' => ["DCMCMP Used RAM", \$dcmcmpUsedRAM],

+       '$veneerReserveRatio' => ["Veneer Reserve Ratio", \$veneerReserveRatio],

+       '$rom1RegionSize' => ["ROM1 Region Size", \$rom1RegionSize],

+       '$zImageRegionSize' => ["ZIMAGE Region Size", \$zImageRegionSize],

+       '$aliceRegionSize' => ["ALICE Region Size", \$aliceRegionSize],

+       '$aliceForbidDummyRegionPadding' => ["ALICE_FORBID Dummy Region Padding", \$aliceForbidDummyRegionPadding],

+       '$anyCodeDummyRegionPadding' => ["ANY_CODE Dummy Region Padding", \$anyCodeDummyRegionPadding],

+       '$anyDataDummyRegionPadding' => ["ANY_DATA Dummy Region Padding", \$anyDataDummyRegionPadding],

+       '$rom1DummyRegionSize' => ["ROM1 Dummy Region Size", \$rom1DummyRegionSize],

+       '$zImageDummyRegionSize' => ["ZIMAGE Dummy Region Size", \$zImageDummyRegionSize],

+       '$aliceDummyRegionSize' => ["ALICE Dummy Region Size", \$aliceDummyRegionSize],

+       '$aliceForbidDummyRegionSize' => ["ALICE_FORBID Dummy Region Size", \$aliceForbidDummyRegionSize],

+       '$anyCodeDummyRegionSize' => ["ANY_CODE Dummy Region Size", \$anyCodeDummyRegionSize],

+       '$anyDataDummyRegionSize' => ["ANY_DATA Dummy Region Size", \$anyDataDummyRegionSize],

+       '$freeRAMSize' => ["Free RAM Size", \$freeRAMSize],

+       '$availableRAM' => ["Available RAM", \$availableRAM],

+      );

+

+   my %objectLists =

+      (

+       '@rom1List' => ["ROM1 List", \@rom1List, '$rom1RegionSize',],

+       '@zImageList' => ["ZIMAGE List", \@zImageList, '$zImageRegionSize',],

+       '@aliceList' => ["ALICE List", \@aliceList, '$aliceRegionSize',],

+       '@aliceForbidDummyList' => ["ALICE_FORBID Dummy List", \@aliceForbidDummyList, '$aliceForbidDummyRegionSize', '$aliceForbidDummyRegionPadding'],

+       '@anyCodeDummyList' => ["ANY_CODE Dummy List", \@anyCodeDummyList, '$anyCodeDummyRegionSize', '$anyCodeDummyRegionPadding'],

+       '@anyDataDummyList' => ["ANY_DATA Dummy List", \@anyDataDummyList, '$anyDataDummyRegionSize', '$anyDataDummyRegionPadding']

+      );

+

+   printLog("Get dummy scatter object lists");

+   {

+      # Basic

+      &_inputObjectListFromFile($objectROM1DummyListFile, \@rom1List, "ROM1");

+      &_inputObjectListFromFile($objectZImageDummyListFile, \@zImageList, "ZIMAGE");

+      &_inputObjectListFromFile($objectAliceDummyListFile, \@aliceList, "ALICE");

+

+      # To be added

+      $aliceForbidDummyRegionPadding = &_inputObjectListFromExecutionRegion("ALICE_FORBID", \@aliceForbidDummyList, "+RO", "ALICE_FORBID list");

+      $anyCodeDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_CODE", \@anyCodeDummyList, "+RO-CODE", "ANY_CODE list");

+      $anyDataDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_DATA", \@anyDataDummyList, "+RO-DATA", "ANY_DATA list");

+   }

+

+   printLog("Get size information");

+   {

+      $rom1DummyRegionSize = &_getExecutionRegionInfo("ROM1", "actual_size");

+      $zImageDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_ER", "actual_size");

+      $aliceDummyRegionSize = &_getExecutionRegionInfo("ALICE", "actual_size");

+      $aliceForbidDummyRegionSize = &_getExecutionRegionInfo("ALICE_FORBID", "actual_size");

+      $anyCodeDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_CODE", "actual_size");

+      $anyDataDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_DATA", "actual_size");

+

+      $rom1RegionSize = $rom1DummyRegionSize;

+      $zImageRegionSize = $zImageDummyRegionSize;

+      $aliceRegionSize = $aliceDummyRegionSize;

+

+      $freeRAMSize = &getFreeRAMSize();

+   }

+

+   # Configure

+   {

+      printLog("Compute Available RAM");

+

+      &_evaluateAssignment('$availableRAM = ($freeRAMSize - $dcmcmpUsedRAM - $zImageDummyRegionSize) * (1 - $veneerReserveRatio)', \%variables);

+      $availableRAM = int($availableRAM);

+

+      if ($availableRAM < 0)

+      {

+         &configFail(CONFIG_FAIL_INSUFFICIENT_RAM, -1 * $availableRAM);

+      }

+

+      # The available RAM is first used to compress ALICE_FORBID list

+      printLog("Push ALICE_FORBID List to ZIMAGE and ROM1");

+      {

+         &_splitObjectListAndPushByAvailableRAM('@aliceForbidDummyList', '@zImageList', '@rom1List',

+                                                \%variables, \%objectLists);

+      }

+

+      # The rest RAM size is then used by ANY_DATA

+      printLog("Push ANY_DATA to ZIMAGE and ROM1");

+      {

+         &_splitObjectListAndPushByAvailableRAM('@anyDataDummyList', '@zImageList', '@rom1List',

+                                                \%variables, \%objectLists);

+      }

+

+      # Finally, the rest RAM is used by ZIMAGE for ANY_CODE

+      printLog("Push ANY_CODE to ZIMAGE or ALICE");

+      {

+         &_splitObjectListAndPushByAvailableRAM('@anyCodeDummyList', '@zImageList', '@aliceList',

+                                                \%variables, \%objectLists);

+      }

+

+      printLog("Compute the Max Compressed Size");

+      {

+         $zImageMaxCompressedSize = &_getRegionMaxCompressedSize("ZIMAGE", $zImageRegionSize, $zImageDummyRegionSize + $anyCodeDummyRegionSize + $anyDataDummyRegionSize, $zImageBinary);

+         $aliceMaxCompressedSize = &_getRegionMaxCompressedSize("ALICE", $aliceRegionSize, $aliceDummyRegionSize, $aliceBinary);

+      }

+

+      $zImageMaxCompressedSize =

+         &vivaHelper::RoundDownToAlignment($zImageMaxCompressedSize, $zImageSizeAlignment);

+      $aliceMaxCompressedSize =

+         &vivaHelper::RoundUpToAlignment($aliceMaxCompressedSize, $aliceSizeAlignment);

+

+      printLog("ZIMAGE Max Compressed Size: ".vivaHelper::DecToHex($zImageMaxCompressedSize));

+      printLog("ALICE Max Compressed Size: ".vivaHelper::DecToHex($aliceMaxCompressedSize));

+   }

+

+   # Check whether the configurations are changed

+   {

+      if ($featureConfig{"CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE"} == $zImageMaxCompressedSize and

+          $featureConfig{"CONFIG_ALICE_MAX_COMPRESSED_SIZE"} == $aliceMaxCompressedSize)

+      {

+         debugLog("Config not changed");

+         $configChanged = 0;

+      }

+      else

+      {

+         debugLog("Config changed");

+         $configChanged = 1;

+      }

+

+      if (&_isObjectListChanged($objectROM1ListFile, \@rom1List) or

+          &_isObjectListChanged($objectZImageListFile, \@zImageList) or

+          &_isObjectListChanged($objectAliceListFile, \@aliceList))

+      {

+         debugLog("Object list changed");

+         $objectListChanged = 1;

+      }

+      else

+      {

+         debugLog("Object list not changed");

+         $objectListChanged = 0;

+      }

+   }

+

+   return ($configChanged, $objectListChanged);

+}

+

+sub configZImage

+{

+   printLog("Configuring ZIMAGE");

+

+   my $rom1RegionSize;

+   my $zImageRegionSize;

+

+   my @anyCodeDummyList;

+   my @anyDataDummyList;

+

+   my $anyCodeDummyRegionPadding;

+   my $anyDataDummyRegionPadding;

+

+   my $rom1DummyRegionSize;

+   my $zImageDummyRegionSize;

+   my $anyCodeDummyRegionSize;

+   my $anyDataDummyRegionSize;

+

+   my $freeRAMSize;

+

+   my $availableRAM;

+

+   my %variables =

+      (

+       '$dcmcmpUsedRAM' => ["DCMCMP Used RAM", \$dcmcmpUsedRAM],

+       '$veneerReserveRatio' => ["Veneer Reserve Ratio", \$veneerReserveRatio],

+       '$rom1RegionSize' => ["ROM1 Region Size", \$rom1RegionSize],

+       '$zImageRegionSize' => ["ZIMAGE Region Size", \$zImageRegionSize],

+       '$anyCodeDummyRegionPadding' => ["ANY_CODE Dummy Region Padding", \$anyCodeDummyRegionPadding],

+       '$anyDataDummyRegionPadding' => ["ANY_DATA Dummy Region Padding", \$anyDataDummyRegionPadding],

+       '$rom1DummyRegionSize' => ["ROM1 Dummy Region Size", \$rom1DummyRegionSize],

+       '$zImageDummyRegionSize' => ["ZIMAGE Dummy Region Size", \$zImageDummyRegionSize],

+       '$anyCodeDummyRegionSize' => ["ANY_CODE Dummy Region Size", \$anyCodeDummyRegionSize],

+       '$anyDataDummyRegionSize' => ["ANY_DATA Dummy Region Size", \$anyDataDummyRegionSize],

+       '$freeRAMSize' => ["Free RAM Size", \$freeRAMSize],

+       '$availableRAM' => ["Available RAM", \$availableRAM],

+      );

+

+   my %objectLists =

+      (

+       '@rom1List' => ["ROM1 List", \@rom1List, '$rom1RegionSize',],

+       '@zImageList' => ["ZIMAGE List", \@zImageList, '$zImageRegionSize',],

+       '@anyCodeDummyList' => ["ANY_CODE Dummy List", \@anyCodeDummyList, '$anyCodeDummyRegionSize', '$anyCodeDummyRegionPadding'],

+       '@anyDataDummyList' => ["ANY_DATA Dummy List", \@anyDataDummyList, '$anyDataDummyRegionSize', '$anyDataDummyRegionPadding']

+      );

+

+   printLog("Get dummy scatter object lists");

+   {

+      # Basic

+      &_inputObjectListFromFile($objectROM1DummyListFile, \@rom1List, "ROM1");

+      &_inputObjectListFromFile($objectZImageDummyListFile, \@zImageList, "ZIMAGE");

+

+      # To be added

+      $anyCodeDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_CODE", \@anyCodeDummyList, "+RO-CODE", "ANY_CODE list");

+      $anyDataDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_DATA", \@anyDataDummyList, "+RO-DATA", "ANY_DATA list");

+   }

+

+   printLog("Get size information");

+   {

+      $rom1DummyRegionSize = &_getExecutionRegionInfo("ROM1", "actual_size");

+      $zImageDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_ER", "actual_size");

+      $anyCodeDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_CODE", "actual_size");

+      $anyDataDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_DATA", "actual_size");

+

+      $rom1RegionSize = $rom1DummyRegionSize;

+      $zImageRegionSize = $zImageDummyRegionSize;

+

+      $freeRAMSize = &getFreeRAMSize();

+   }

+

+   # Configure

+   {

+      printLog("Compute Available RAM");

+      &_evaluateAssignment('$availableRAM = int(($freeRAMSize - $dcmcmpUsedRAM - $zImageDummyRegionSize) * (1 - $veneerReserveRatio))', \%variables);

+

+      if ($availableRAM < 0)

+      {

+         &configFail(CONFIG_FAIL_INSUFFICIENT_RAM, -1 * $availableRAM);

+      }

+

+      # The rest RAM size is first used by ANY_DATA

+      printLog("Push ANY_DATA to ZIMAGE and ROM1");

+      {

+         &_splitObjectListAndPushByAvailableRAM('@anyDataDummyList', '@zImageList', '@rom1List',

+                                                \%variables, \%objectLists);

+      }

+

+      # Finally, the rest RAM is used by ZIMAGE for ANY_CODE

+      printLog("Push ANY_CODE to ZIMAGE or ROM1");

+      {

+         &_splitObjectListAndPushByAvailableRAM('@anyCodeDummyList', '@zImageList', '@rom1List',

+                                                \%variables, \%objectLists);

+      }

+

+      printLog("Compute the Max Compressed Size");

+      {

+         $zImageMaxCompressedSize = &_getRegionMaxCompressedSize("ZIMAGE", $zImageRegionSize, $zImageDummyRegionSize + $anyCodeDummyRegionSize + $anyDataDummyRegionSize, $zImageBinary);

+      }

+

+      $zImageMaxCompressedSize =

+         &vivaHelper::RoundDownToAlignment($zImageMaxCompressedSize, $zImageSizeAlignment);

+

+      printLog("ZIMAGE Max Compressed Size: ".vivaHelper::DecToHex($zImageMaxCompressedSize));

+   }

+

+   # Check whether the configurations are changed

+   {

+      if ($featureConfig{"CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE"} == $zImageMaxCompressedSize)

+      {

+         debugLog("Config not changed");

+         $configChanged = 0;

+      }

+      else

+      {

+         debugLog("Config changed");

+         $configChanged = 1;

+      }

+

+      if (&_isObjectListChanged($objectROM1ListFile, \@rom1List) or

+          &_isObjectListChanged($objectZImageListFile, \@zImageList))

+      {

+         debugLog("Object list changed");

+         $objectListChanged = 1;

+      }

+      else

+      {

+         debugLog("Object list not changed");

+         $objectListChanged = 0;

+      }

+   }

+

+   return ($configChanged, $objectListChanged);

+}

+

+sub configAlice

+{

+   printLog("Configuring ZIMAGE");

+

+   my $aliceDummyRegionSize = &_getExecutionRegionInfo("ALICE", "actual_size");

+   $aliceMaxCompressedSize = &_getRegionMaxCompressedSize("ALICE", $aliceDummyRegionSize, $aliceDummyRegionSize, $aliceBinary);

+

+   if ($mbaEnabled)

+   {

+      $aliceMaxCompressedSize = $aliceMaxCompressedSize * (1 + 0.02);

+      debugLog("MBA is enabled");

+      debugLog("Alice Max Compressed Size = Alice Max Compressed Size * (1 + Veneer Reserved Ratio)");

+      debugLog("   = $aliceMaxCompressedSize");

+   }

+

+   $aliceMaxCompressedSize =

+      &vivaHelper::RoundUpToAlignment($aliceMaxCompressedSize, $aliceSizeAlignment);

+

+   printLog("ALICE Max Compressed Size: ".vivaHelper::DecToHex($aliceMaxCompressedSize));

+   if ($featureConfig{"CONFIG_ALICE_MAX_COMPRESSED_SIZE"} == $aliceMaxCompressedSize)

+   {

+      debugLog("Config not changed");

+      $configChanged = 0;

+   }

+   else

+   {

+      debugLog("Config changed");

+      $configChanged = 1;

+   }

+

+   return $configChanged;

+}

+

+sub _inputObjectListFromFile

+{

+   my $filename = shift;

+   my $listRef = shift;

+   my $listName = shift;

+   my @filePath = fileparse($filename);

+

+   &vivaHelper::InputObjectListFromFile($filename, $listRef);

+   debugLog("Input $listName list from $filePath[0]");

+}

+

+sub _inputObjectListFromExecutionRegion

+{

+   my $regionName = shift;

+   my $listRef = shift;

+   my $defaultAttribute = shift;

+   my $defaultCategory = shift;

+   my $padding = 0;

+

+   $padding = &vivaHelper::GetLISExecutionRegionObjectList($regionName, $listRef, $defaultAttribute, $defaultCategory);

+   debugLog("Get $regionName list from LIS execution region, padding = $padding");

+   return $padding;

+}

+

+sub _getExecutionRegionInfo

+{

+   my $regionName = shift;

+   my $infoName = shift;

+   my %regionInfo;

+   my $result;

+

+   &vivaHelper::GetLISExecutionRegionInfo($regionName, \%regionInfo);

+   $result = $regionInfo{$infoName};

+   debugLog("$regionName execution region $infoName = $result");

+

+   return $result;

+}

+

+sub _getRegionMaxCompressedSize

+{

+   my $regionName = shift;

+   my $regionSize = shift;

+   my $dummyRegionSize = shift;

+   my $dummyCompressedBinary = shift;

+

+   my $dummyCompressedSize = -s $dummyCompressedBinary or

+      &vivaHelper::ErrorHandler("Cannot get file size $dummyCompressedBinary: $!", __FILE__, __LINE__);

+   #debugLog("$regionName Dummy Region Size = $dummyRegionSize");

+   #debugLog("$regionName Dummy Compressed Binary Size = $dummyCompressedSize");

+

+   my $compressionRatio = $dummyCompressedSize / $dummyRegionSize;

+   #debugLog("$regionName Compression Ratio = $regionName Dummy Compressed Binary Size / $regionName Dummy Region Size");

+   #debugLog("   = $dummyCompressedSize / $dummyRegionSize");

+   #debugLog("   = $compressionRatio");

+

+   my $maxCompressedSize = int($regionSize * $compressionRatio + 0.99);

+   debugLog("$regionName max compressed size = $regionName Region Size * $regionName Compression Ratio");

+   debugLog("   = $regionSize * $compressionRatio");

+   debugLog("   = $maxCompressedSize");

+

+   return $maxCompressedSize;

+}

+

+sub _pushToObjectList

+{

+   my $targetList = shift;

+   my $sourceList = shift;

+

+   my $variables = shift;

+   my $objectLists = shift;

+

+   push @{$objectLists->{$targetList}[1]}, @{$objectLists->{$sourceList}[1]};

+   debugLog("$objectLists->{$targetList}[0] += $objectLists->{$sourceList}[0]");

+   _evaluateAssignment("$objectLists->{$targetList}[2] = $objectLists->{$targetList}[2] + $objectLists->{$sourceList}[2]", $variables);

+}

+

+sub _splitObjectListAndPush

+{

+   my $sourceList = shift;

+   my $firstList = shift;

+   my $secondList = shift;

+

+   my $splitSize = shift;

+

+   my $variables = shift;

+   my $objectLists = shift;

+

+   my $splitSizeWithVeneer;

+   my $actualSplitSize;

+

+   my @list1;

+   my @list2;

+

+   $variables->{'$splitSizeWithVeneer'} = ["Splitted Size with Veneer", \$splitSizeWithVeneer];

+   $variables->{'$actualSplitSize'} = ["Actual Splitted Size", \$actualSplitSize];

+

+   #$objectLists->{'@list1'} = ["Splitted List", \@list1, '$actualSplitSize * (1 + $veneerReserveRatio)'];

+   $objectLists->{'@list1'} = ["Splitted List", \@list1, '$actualSplitSize + '."$objectLists->{$sourceList}[3]"];

+   $objectLists->{'@list2'} = ["Rest List", \@list2, "$objectLists->{$sourceList}[2]".' - $actualSplitSize'];

+

+   debugLog("Split $objectLists->{$sourceList}[0]");

+

+   #&_evaluateAssignment('$splitSizeWithVeneer = '."$splitSize".' * (1 + $veneerReserveRatio)', $variables);

+   &_evaluateAssignment('$splitSizeWithVeneer = '."$splitSize", $variables);

+   $splitSizeWithVeneer = int($splitSizeWithVeneer);

+

+   $actualSplitSize = &vivaHelper::SplitObjectListBySize($objectLists->{$sourceList}[1], $splitSizeWithVeneer,

+                                                         \@list1, \@list2);

+   debugLog("Actual Splitted Size = $actualSplitSize");

+

+   &_pushToObjectList($firstList, '@list1', $variables, $objectLists);

+   &_pushToObjectList($secondList, '@list2', $variables, $objectLists);

+

+   delete $variables->{'$splitSizeWithVeneer'};

+   delete $variables->{'$actualSplitSize'};

+

+   delete $objectLists->{'@list1'};

+   delete $objectLists->{'@list2'};

+

+   return $actualSplitSize;

+}

+

+sub _splitObjectListAndPushByAvailableRAM

+{

+   my $sourceList = shift;

+   my $firstList = shift;

+   my $secondList = shift;

+

+   my $variables = shift;

+   my $objectLists = shift;

+

+   if (${$variables->{'$availableRAM'}[1]} < $smallestSplitableRAMSize and ${$variables->{'$availableRAM'}[1]} != 0)

+   {

+      debugLog("Available RAM < Smallest Splitable RAM");

+      debugLog("   = $smallestSplitableRAMSize");

+      ${$variables->{'$availableRAM'}[1]} = 0;

+      debugLog("Available RAM = 0");

+   }

+

+   &_splitObjectListAndPush($sourceList, $firstList, $secondList,

+                            '$availableRAM', $variables, $objectLists);

+

+   if (${$variables->{'$availableRAM'}[1]} >= ${$variables->{$objectLists->{$sourceList}[2]}[1]})

+   {

+      &_evaluateAssignment('$availableRAM = $availableRAM - '."$objectLists->{$sourceList}[2]", $variables);

+   }

+   else

+   {

+      ${$variables->{'$availableRAM'}[1]} = 0;

+      debugLog("Available RAM = 0");

+   }

+}

+

+sub _evaluateAssignment

+{

+   my $assignmentString = shift;

+   my $variables = shift;

+   my @assignment = split(/=/, $assignmentString);

+

+   my $symbolString = $assignmentString;

+

+   $assignment[0] =~ s/(?:^ +)||(?: +$)//g;

+   $assignment[1] =~ s/(?:^ +)||(?: +$)//g;

+

+   my $evaluationString = $assignment[1];

+

+   while (my ($key, $value)= each %$variables)

+   {

+      my $matchSymbol = "\\$key";

+      $symbolString =~ s/$matchSymbol/$value->[0]/g;

+      $evaluationString =~ s/$matchSymbol/${$value->[1]}/g;

+   }

+

+   my $intermediate = eval{$evaluationString};

+   my $assigneeRef = $variables->{$assignment[0]}[1];

+

+   $$assigneeRef = eval ($evaluationString);

+

+   debugLog($symbolString);

+   debugLog("   = $intermediate");

+   debugLog("   = $$assigneeRef");

+}

+

+sub _isObjectListChanged

+{

+   my $objectListFile = shift;

+   my $objectListRef = shift;

+

+   my @objectListOriginal;

+

+   &vivaHelper::InputObjectListFromFile($objectListFile, \@objectListOriginal);

+

+   if (&vivaHelper::CompareObjectList(\@objectListOriginal, $objectListRef) == 0)

+   {

+      return 0;

+   }

+   else

+   {

+      return 1;

+   }

+}

+

+sub configBootZImage_ZImage_Alice_FavorROM

+{

+   printLog("Configuring BOOT_ZIMAGE, ZIMAGE, and ALICE favoring ROM...");

+

+   my $rom1RegionSize;

+   my $bootZImageRegionSize;

+   my $zImageRegionSize;

+   my $aliceRegionSize;

+

+   my @bootZImageDummyList;

+   my @aliceForbidDummyList;

+   my @anyCodeDummyList;

+   my @anyDataDummyList;

+

+   my $bootZImageDummyRegionPadding;

+   my $aliceForbidDummyRegionPadding;

+   my $anyCodeDummyRegionPadding;

+   my $anyDataDummyRegionPadding;

+

+   my $rom1DummyRegionSize;

+   my $bootZImageDummyRegionSize;

+   my $zImageDummyRegionSize;

+   my $aliceDummyRegionSize;

+   my $aliceForbidDummyRegionSize;

+   my $anyCodeDummyRegionSize;

+   my $anyDataDummyRegionSize;

+

+   my $bootZImageDummyCompressionRatio;

+   my $zImageDummyCompressionRatio;

+   my $aliceDummyCompressionRatio;

+

+   my $freeRAMSize;

+

+   my $availableRAM;

+

+   my $exceedROMSize;

+

+   my $targetSplitSize;

+

+   my %variables =

+      (

+       '$dcmcmpUsedRAM' => ["DCMCMP Used RAM", \$dcmcmpUsedRAM],

+       '$veneerReserveRatio' => ["Veneer Reserve Ratio", \$veneerReserveRatio],

+       '$rom1RegionSize' => ["ROM1 Region Size", \$rom1RegionSize],

+       '$bootZImageRegionSize' => ["BOOT_ZIMAGE Region Size", \$bootZImageRegionSize],

+       '$zImageRegionSize' => ["ZIMAGE Region Size", \$zImageRegionSize],

+       '$aliceRegionSize' => ["ALICE Region Size", \$aliceRegionSize],

+       '$bootZImageDummyRegionPadding' => ["BOOT_ZIMAGE Dummy Region Padding", \$bootZImageDummyRegionPadding],

+       '$aliceForbidDummyRegionPadding' => ["ALICE_FORBID Dummy Region Padding", \$aliceForbidDummyRegionPadding],

+       '$anyCodeDummyRegionPadding' => ["ANY_CODE Dummy Region Padding", \$anyCodeDummyRegionPadding],

+       '$anyDataDummyRegionPadding' => ["ANY_DATA Dummy Region Padding", \$anyDataDummyRegionPadding],

+       '$rom1DummyRegionSize' => ["ROM1 Dummy Region Size", \$rom1DummyRegionSize],

+       '$bootZImageDummyRegionSize' => ["BOOT_ZIMAGE Dummy Region Size", \$bootZImageDummyRegionSize],

+       '$zImageDummyRegionSize' => ["ZIMAGE Dummy Region Size", \$zImageDummyRegionSize],

+       '$aliceDummyRegionSize' => ["ALICE Dummy Region Size", \$aliceDummyRegionSize],

+       '$aliceForbidDummyRegionSize' => ["ALICE_FORBID Dummy Region Size", \$aliceForbidDummyRegionSize],

+       '$anyCodeDummyRegionSize' => ["ANY_CODE Dummy Region Size", \$anyCodeDummyRegionSize],

+       '$anyDataDummyRegionSize' => ["ANY_DATA Dummy Region Size", \$anyDataDummyRegionSize],

+       '$bootZImageDummyCompressionRatio' => ["BOOT_ZIMAGE Dummy Compression Ratio", \$bootZImageDummyCompressionRatio],

+       '$zImageDummyCompressionRatio' => ["ZIMAGE Dummy Compression Ratio", \$zImageDummyCompressionRatio],

+       '$aliceDummyCompressionRatio' => ["ALICE Dummy Compression Ratio", \$aliceDummyCompressionRatio],

+       '$freeRAMSize' => ["Free RAM Size", \$freeRAMSize],

+       '$availableRAM' => ["Available RAM", \$availableRAM],

+       '$exceedROMSize' => ["Exceed ROM Size", \$exceedROMSize],

+       '$targetSplitSize' => ["Target Split Size", \$targetSplitSize],

+      );

+

+   my %objectLists =

+      (

+       '@rom1List' => ["ROM1 List", \@rom1List, '$rom1RegionSize',],

+       '@bootZImageList' => ["BOOT_ZIMAGE List", \@bootZImageList, '$bootZImageRegionSize',],

+       '@zImageList' => ["ZIMAGE List", \@zImageList, '$zImageRegionSize',],

+       '@aliceList' => ["ALICE List", \@aliceList, '$aliceRegionSize',],

+       '@bootZImageDummyList' => ["BOOT_ZIMAGE Dummy List", \@bootZImageDummyList, '$bootZImageDummyRegionSize', '$bootZImageDummyRegionPadding'],

+       '@aliceForbidDummyList' => ["ALICE_FORBID Dummy List", \@aliceForbidDummyList, '$aliceForbidDummyRegionSize', '$aliceForbidDummyRegionPadding'],

+       '@anyCodeDummyList' => ["ANY_CODE Dummy List", \@anyCodeDummyList, '$anyCodeDummyRegionSize', '$anyCodeDummyRegionPadding'],

+       '@anyDataDummyList' => ["ANY_DATA Dummy List", \@anyDataDummyList, '$anyDataDummyRegionSize', '$anyDataDummyRegionPadding']

+      );

+

+   printLog("Get dummy scatter object lists");

+   {

+      # Basic

+      &_inputObjectListFromFile($objectROM1DummyListFile, \@rom1List, "ROM1");

+      &_inputObjectListFromFile($objectBootZImageDummyListFile, \@bootZImageList, "BOOT_ZIMAGE");

+      &_inputObjectListFromFile($objectZImageDummyListFile, \@zImageList, "ZIMAGE");

+      &_inputObjectListFromFile($objectAliceDummyListFile, \@aliceList, "ALICE");

+

+      # To be added

+      $bootZImageDummyRegionPadding = &_inputObjectListFromExecutionRegion("BOOT_ZIMAGE_ER", \@bootZImageDummyList, "+RO", "BOOT_ZIMAGE list");

+      $aliceForbidDummyRegionPadding = &_inputObjectListFromExecutionRegion("ALICE_FORBID", \@aliceForbidDummyList, "+RO", "ALICE_FORBID list");

+      $anyCodeDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_CODE", \@anyCodeDummyList, "+RO-CODE", "ANY_CODE list");

+      $anyDataDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_DATA", \@anyDataDummyList, "+RO-DATA", "ANY_DATA list");

+   }

+

+   printLog("Get size information");

+   {

+      $rom1DummyRegionSize = &_getExecutionRegionInfo("ROM1", "actual_size");

+      $bootZImageDummyRegionSize = &_getExecutionRegionInfo("BOOT_ZIMAGE_ER", "actual_size");

+      $zImageDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_ER", "actual_size");

+      $aliceDummyRegionSize = &_getExecutionRegionInfo("ALICE", "actual_size");

+      $aliceForbidDummyRegionSize = &_getExecutionRegionInfo("ALICE_FORBID", "actual_size");

+      $anyCodeDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_CODE", "actual_size");

+      $anyDataDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_DATA", "actual_size");

+

+      $rom1RegionSize = $rom1DummyRegionSize;

+      $bootZImageRegionSize = $bootZImageDummyRegionSize;

+      $zImageRegionSize = $zImageDummyRegionSize;

+      $aliceRegionSize = $aliceDummyRegionSize;

+

+      $freeRAMSize = &getFreeRAMSize();

+

+      $exceedROMSize = &getExceedROMSize();

+   }

+

+   # Configure

+   {

+      printLog("Compute Available RAM");

+

+      &_evaluateAssignment('$availableRAM = ($freeRAMSize - $dcmcmpUsedRAM - $zImageDummyRegionSize) * (1 - $veneerReserveRatio)', \%variables);

+      $availableRAM = int($availableRAM);

+

+      if ($availableRAM < 0)

+      {

+         &configFail(CONFIG_FAIL_INSUFFICIENT_RAM, -1 * $availableRAM);

+      }

+

+      # Compute the compression ratios

+      printLog("Compute the compression ratios");

+      {

+         $bootZImageDummyCompressionRatio = &_getCompressionRatio("BOOT_ZIMAGE", $bootZImageDummyRegionSize, $bootZImageBinary);

+         $zImageDummyCompressionRatio = &_getCompressionRatio("ZIMAGE", $zImageDummyRegionSize + $anyCodeDummyRegionSize + $anyDataDummyRegionSize, $zImageBinary);

+         $aliceDummyCompressionRatio = &_getCompressionRatio("ALICE", $aliceDummyRegionSize, $aliceBinary);

+      }

+

+      # Assume ANY_CODE in ALICE

+      printLog("Assume ANY_CODE are all in ALICE");

+      {

+         &_evaluateAssignment('$exceedROMSize = int($exceedROMSize - $anyCodeDummyRegionSize * (1 - $aliceDummyCompressionRatio))', \%variables);

+

+         if ($exceedROMSize > $availableRAM * (1 - $zImageDummyCompressionRatio))

+         {

+            debugLog("Exceed ROM Size > Available RAM * (1 - ZIMAGE Dummy Compression Ratio)");

+            debugLog("   = $availableRAM * (1 - $zImageDummyCompressionRatio)");

+            debugLog("   = ".($availableRAM * (1 - $zImageDummyCompressionRatio)));

+            &configFail(CONFIG_FAIL_INSUFFICIENT_RAM, $exceedROMSize / (1 - $zImageDummyCompressionRatio) - $availableRAM);

+         }

+      }

+

+      # Push ALICE_FORBID to ZIMAGE or ROM1

+      &_splitObjectListAndPushByExceedROM('@aliceForbidDummyList', '@zImageList', '@rom1List',

+                                          '$zImageDummyCompressionRatio', \%variables, \%objectLists);

+

+      # Push ANY_DATA to ZIMAGE or ROM1

+      &_splitObjectListAndPushByExceedROM('@anyDataDummyList', '@zImageList', '@rom1List',

+                                          '$zImageDummyCompressionRatio', \%variables, \%objectLists);

+

+      # Push BOOT_ZIMAGE Dummy to BOOT_ZIMAGE or ROM1

+      &vivaHelper::ChangeObjectListAttributeListByObjectList(\@bootZImageDummyList, \@bootZImageList);

+      @bootZImageList = pop @bootZImageDummyList; # Push at least one entry to BOOT_ZIMAGE to prevent empty

+      $bootZImageRegionSize = 0;

+      &_splitObjectListAndPushByExceedROM('@bootZImageDummyList', '@bootZImageList', '@rom1List',

+                                          '$bootZImageDummyCompressionRatio', \%variables, \%objectLists);

+

+      # Push ANY_CODE to ZIMAGE or ALICE

+      &_splitObjectListAndPushByExceedROM('@anyCodeDummyList', '@zImageList', '@aliceList',

+                                          '$aliceDummyCompressionRatio - $zImageDummyCompressionRatio', \%variables, \%objectLists);

+

+      #if ($exceedROMSize > 0)

+      #{

+      #   &configFail(CONFIG_FAIL_INSUFFICIENT_FLASH_SIZE, $exceedROMSize);

+      #}

+

+      printLog("Compute the Max Compressed Size");

+      {

+         $bootZImageMaxCompressedSize = &_getRegionMaxCompressedSize("BOOT_ZIMAGE", $bootZImageRegionSize, $bootZImageDummyRegionSize, $bootZImageBinary);

+         $zImageMaxCompressedSize = &_getRegionMaxCompressedSize("ZIMAGE", $zImageRegionSize, $zImageDummyRegionSize + $anyCodeDummyRegionSize + $anyDataDummyRegionSize, $zImageBinary);

+         $aliceMaxCompressedSize = &_getRegionMaxCompressedSize("ALICE", $aliceRegionSize, $aliceDummyRegionSize, $aliceBinary);

+      }

+

+      $bootZImageMaxCompressedSize =

+         &vivaHelper::RoundUpToAlignment($bootZImageMaxCompressedSize, $bootZImageSizeAlignment);

+      $zImageMaxCompressedSize =

+         &vivaHelper::RoundDownToAlignment($zImageMaxCompressedSize, $zImageSizeAlignment);

+      $aliceMaxCompressedSize =

+         &vivaHelper::RoundUpToAlignment($aliceMaxCompressedSize, $aliceSizeAlignment);

+

+      printLog("BOOT_ZIMAGE Max Compressed Size: ".vivaHelper::DecToHex($bootZImageMaxCompressedSize));

+      printLog("ZIMAGE Max Compressed Size: ".vivaHelper::DecToHex($zImageMaxCompressedSize));

+      printLog("ALICE Max Compressed Size: ".vivaHelper::DecToHex($aliceMaxCompressedSize));

+   }

+

+   # Check whether the configurations are changed

+   {

+      if ($featureConfig{"CONFIG_BOOT_ZIMAGE_MAX_COMPRESSED_SIZE"} == $bootZImageMaxCompressedSize and

+          $featureConfig{"CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE"} == $zImageMaxCompressedSize and

+          $featureConfig{"CONFIG_ALICE_MAX_COMPRESSED_SIZE"} == $aliceMaxCompressedSize)

+      {

+         debugLog("Config not changed");

+         $configChanged = 0;

+      }

+      else

+      {

+         debugLog("Config changed");

+         $configChanged = 1;

+      }

+

+      if (&_isObjectListChanged($objectROM1ListFile, \@rom1List) or

+          &_isObjectListChanged($objectBootZImageListFile, \@bootZImageList) or

+          &_isObjectListChanged($objectZImageListFile, \@zImageList) or

+          &_isObjectListChanged($objectAliceListFile, \@aliceList))

+      {

+         debugLog("Object list changed");

+         $objectListChanged = 1;

+      }

+      else

+      {

+         debugLog("Object list not changed");

+         $objectListChanged = 0;

+      }

+   }

+

+   return ($configChanged, $objectListChanged);

+}

+

+sub configZImage_Alice_FavorROM

+{

+   printLog("Configuring ZIMAGE and ALICE favoring ROM...");

+

+   my $rom1RegionSize;

+   my $zImageRegionSize;

+   my $aliceRegionSize;

+

+   my @aliceForbidDummyList;

+   my @anyCodeDummyList;

+   my @anyDataDummyList;

+

+   my $aliceForbidDummyRegionPadding;

+   my $anyCodeDummyRegionPadding;

+   my $anyDataDummyRegionPadding;

+

+   my $rom1DummyRegionSize;

+   my $zImageDummyRegionSize;

+   my $aliceDummyRegionSize;

+   my $aliceForbidDummyRegionSize;

+   my $anyCodeDummyRegionSize;

+   my $anyDataDummyRegionSize;

+

+   my $zImageDummyCompressionRatio;

+   my $aliceDummyCompressionRatio;

+

+   my $freeRAMSize;

+

+   my $availableRAM;

+

+   my $exceedROMSize;

+

+   my $targetSplitSize;

+

+   my %variables =

+      (

+       '$dcmcmpUsedRAM' => ["DCMCMP Used RAM", \$dcmcmpUsedRAM],

+       '$veneerReserveRatio' => ["Veneer Reserve Ratio", \$veneerReserveRatio],

+       '$rom1RegionSize' => ["ROM1 Region Size", \$rom1RegionSize],

+       '$zImageRegionSize' => ["ZIMAGE Region Size", \$zImageRegionSize],

+       '$aliceRegionSize' => ["ALICE Region Size", \$aliceRegionSize],

+       '$aliceForbidDummyRegionPadding' => ["ALICE_FORBID Dummy Region Padding", \$aliceForbidDummyRegionPadding],

+       '$anyCodeDummyRegionPadding' => ["ANY_CODE Dummy Region Padding", \$anyCodeDummyRegionPadding],

+       '$anyDataDummyRegionPadding' => ["ANY_DATA Dummy Region Padding", \$anyDataDummyRegionPadding],

+       '$rom1DummyRegionSize' => ["ROM1 Dummy Region Size", \$rom1DummyRegionSize],

+       '$zImageDummyRegionSize' => ["ZIMAGE Dummy Region Size", \$zImageDummyRegionSize],

+       '$aliceDummyRegionSize' => ["ALICE Dummy Region Size", \$aliceDummyRegionSize],

+       '$aliceForbidDummyRegionSize' => ["ALICE_FORBID Dummy Region Size", \$aliceForbidDummyRegionSize],

+       '$anyCodeDummyRegionSize' => ["ANY_CODE Dummy Region Size", \$anyCodeDummyRegionSize],

+       '$anyDataDummyRegionSize' => ["ANY_DATA Dummy Region Size", \$anyDataDummyRegionSize],

+       '$zImageDummyCompressionRatio' => ["ZIMAGE Dummy Compression Ratio", \$zImageDummyCompressionRatio],

+       '$aliceDummyCompressionRatio' => ["ALICE Dummy Compression Ratio", \$aliceDummyCompressionRatio],

+       '$freeRAMSize' => ["Free RAM Size", \$freeRAMSize],

+       '$availableRAM' => ["Available RAM", \$availableRAM],

+       '$exceedROMSize' => ["Exceed ROM Size", \$exceedROMSize],

+       '$targetSplitSize' => ["Target Split Size", \$targetSplitSize],

+      );

+

+   my %objectLists =

+      (

+       '@rom1List' => ["ROM1 List", \@rom1List, '$rom1RegionSize',],

+       '@zImageList' => ["ZIMAGE List", \@zImageList, '$zImageRegionSize',],

+       '@aliceList' => ["ALICE List", \@aliceList, '$aliceRegionSize',],

+       '@aliceForbidDummyList' => ["ALICE_FORBID Dummy List", \@aliceForbidDummyList, '$aliceForbidDummyRegionSize', '$aliceForbidDummyRegionPadding'],

+       '@anyCodeDummyList' => ["ANY_CODE Dummy List", \@anyCodeDummyList, '$anyCodeDummyRegionSize', '$anyCodeDummyRegionPadding'],

+       '@anyDataDummyList' => ["ANY_DATA Dummy List", \@anyDataDummyList, '$anyDataDummyRegionSize', '$anyDataDummyRegionPadding']

+      );

+

+   printLog("Get dummy scatter object lists");

+   {

+      # Basic

+      &_inputObjectListFromFile($objectROM1DummyListFile, \@rom1List, "ROM1");

+      &_inputObjectListFromFile($objectZImageDummyListFile, \@zImageList, "ZIMAGE");

+      &_inputObjectListFromFile($objectAliceDummyListFile, \@aliceList, "ALICE");

+

+      # To be added

+      $aliceForbidDummyRegionPadding = &_inputObjectListFromExecutionRegion("ALICE_FORBID", \@aliceForbidDummyList, "+RO", "ALICE_FORBID list");

+      $anyCodeDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_CODE", \@anyCodeDummyList, "+RO-CODE", "ANY_CODE list");

+      $anyDataDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_DATA", \@anyDataDummyList, "+RO-DATA", "ANY_DATA list");

+   }

+

+   printLog("Get size information");

+   {

+      $rom1DummyRegionSize = &_getExecutionRegionInfo("ROM1", "actual_size");

+      $zImageDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_ER", "actual_size");

+      $aliceDummyRegionSize = &_getExecutionRegionInfo("ALICE", "actual_size");

+      $aliceForbidDummyRegionSize = &_getExecutionRegionInfo("ALICE_FORBID", "actual_size");

+      $anyCodeDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_CODE", "actual_size");

+      $anyDataDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_DATA", "actual_size");

+

+      $rom1RegionSize = $rom1DummyRegionSize;

+      $zImageRegionSize = $zImageDummyRegionSize;

+      $aliceRegionSize = $aliceDummyRegionSize;

+

+      $freeRAMSize = &getFreeRAMSize();

+

+      $exceedROMSize = &getExceedROMSize();

+   }

+

+   # Configure

+   {

+      printLog("Compute Available RAM");

+      &_evaluateAssignment('$availableRAM = int(($freeRAMSize - $dcmcmpUsedRAM - $zImageDummyRegionSize) * (1 - $veneerReserveRatio))', \%variables);

+

+      if ($availableRAM < 0)

+      {

+         &configFail(CONFIG_FAIL_INSUFFICIENT_RAM, -1 * $availableRAM);

+      }

+

+      # Compute the compression ratios

+      printLog("Compute the compression ratios");

+      {

+         $zImageDummyCompressionRatio = &_getCompressionRatio("ZIMAGE", $zImageDummyRegionSize + $anyCodeDummyRegionSize + $anyDataDummyRegionSize, $zImageBinary);

+         $aliceDummyCompressionRatio = &_getCompressionRatio("ALICE", $aliceDummyRegionSize, $aliceBinary);

+      }

+

+      # Assume ANY_CODE in ALICE

+      printLog("Assume ANY_CODE are all in ALICE");

+      {

+         &_evaluateAssignment('$exceedROMSize = int($exceedROMSize - $anyCodeDummyRegionSize * (1 - $aliceDummyCompressionRatio))', \%variables);

+

+         if ($exceedROMSize > $availableRAM * (1 - $zImageDummyCompressionRatio))

+         {

+            debugLog("Exceed ROM Size > Available RAM * (1 - ZIMAGE Dummy Compression Ratio)");

+            debugLog("   = $availableRAM * (1 - $zImageDummyCompressionRatio)");

+            debugLog("   = ".($availableRAM * (1 - $zImageDummyCompressionRatio)));

+            &configFail(CONFIG_FAIL_INSUFFICIENT_RAM, $exceedROMSize / (1 - $zImageDummyCompressionRatio) - $availableRAM);

+         }

+      }

+

+      # Push ALICE_FORBID to ZIMAGE or ROM1

+      &_splitObjectListAndPushByExceedROM('@aliceForbidDummyList', '@zImageList', '@rom1List',

+                                          '$zImageDummyCompressionRatio', \%variables, \%objectLists);

+

+      # Push ANY_DATA to ZIMAGE or ROM1

+      &_splitObjectListAndPushByExceedROM('@anyDataDummyList', '@zImageList', '@rom1List',

+                                          '$zImageDummyCompressionRatio', \%variables, \%objectLists);

+

+      # Push ANY_CODE to ZIMAGE or ALICE

+      &_splitObjectListAndPushByExceedROM('@anyCodeDummyList', '@zImageList', '@aliceList',

+                                          '$aliceDummyCompressionRatio - $zImageDummyCompressionRatio', \%variables, \%objectLists);

+

+      #if ($exceedROMSize > 0)

+      #{

+      #   &configFail(CONFIG_FAIL_INSUFFICIENT_FLASH_SIZE, $exceedROMSize);

+      #}

+

+      printLog("Compute the Max Compressed Size");

+      {

+         $zImageMaxCompressedSize = &_getRegionMaxCompressedSize("ZIMAGE", $zImageRegionSize, $zImageDummyRegionSize + $anyCodeDummyRegionSize + $anyDataDummyRegionSize, $zImageBinary);

+         $aliceMaxCompressedSize = &_getRegionMaxCompressedSize("ALICE", $aliceRegionSize, $aliceDummyRegionSize, $aliceBinary);

+      }

+

+      $zImageMaxCompressedSize =

+         &vivaHelper::RoundDownToAlignment($zImageMaxCompressedSize, $zImageSizeAlignment);

+      $aliceMaxCompressedSize =

+         &vivaHelper::RoundUpToAlignment($aliceMaxCompressedSize, $aliceSizeAlignment);

+

+      printLog("ZIMAGE Max Compressed Size: ".vivaHelper::DecToHex($zImageMaxCompressedSize));

+      printLog("ALICE Max Compressed Size: ".vivaHelper::DecToHex($aliceMaxCompressedSize));

+   }

+

+   # Check whether the configurations are changed

+   {

+      if ($featureConfig{"CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE"} == $zImageMaxCompressedSize and

+          $featureConfig{"CONFIG_ALICE_MAX_COMPRESSED_SIZE"} == $aliceMaxCompressedSize)

+      {

+         debugLog("Config not changed");

+         $configChanged = 0;

+      }

+      else

+      {

+         debugLog("Config changed");

+         $configChanged = 1;

+      }

+

+      if (&_isObjectListChanged($objectROM1ListFile, \@rom1List) or

+          &_isObjectListChanged($objectZImageListFile, \@zImageList) or

+          &_isObjectListChanged($objectAliceListFile, \@aliceList))

+      {

+         debugLog("Object list changed");

+         $objectListChanged = 1;

+      }

+      else

+      {

+         debugLog("Object list not changed");

+         $objectListChanged = 0;

+      }

+   }

+

+   return ($configChanged, $objectListChanged);

+}

+

+sub configZImage_FavorROM

+{

+   printLog("Configuring ZIMAGE favoring ROM...");

+

+   my $rom1RegionSize;

+   my $zImageRegionSize;

+

+   my @anyCodeDummyList;

+   my @anyDataDummyList;

+

+   my $anyCodeDummyRegionPadding;

+   my $anyDataDummyRegionPadding;

+

+   my $rom1DummyRegionSize;

+   my $zImageDummyRegionSize;

+   my $anyCodeDummyRegionSize;

+   my $anyDataDummyRegionSize;

+

+   my $zImageDummyCompressionRatio;

+

+   my $freeRAMSize;

+

+   my $availableRAM;

+

+   my $exceedROMSize;

+

+   my $targetSplitSize;

+

+   my %variables =

+      (

+       '$dcmcmpUsedRAM' => ["DCMCMP Used RAM", \$dcmcmpUsedRAM],

+       '$veneerReserveRatio' => ["Veneer Reserve Ratio", \$veneerReserveRatio],

+       '$rom1RegionSize' => ["ROM1 Region Size", \$rom1RegionSize],

+       '$zImageRegionSize' => ["ZIMAGE Region Size", \$zImageRegionSize],

+       '$anyCodeDummyRegionPadding' => ["ANY_CODE Dummy Region Padding", \$anyCodeDummyRegionPadding],

+       '$anyDataDummyRegionPadding' => ["ANY_DATA Dummy Region Padding", \$anyDataDummyRegionPadding],

+       '$rom1DummyRegionSize' => ["ROM1 Dummy Region Size", \$rom1DummyRegionSize],

+       '$zImageDummyRegionSize' => ["ZIMAGE Dummy Region Size", \$zImageDummyRegionSize],

+       '$anyCodeDummyRegionSize' => ["ANY_CODE Dummy Region Size", \$anyCodeDummyRegionSize],

+       '$anyDataDummyRegionSize' => ["ANY_DATA Dummy Region Size", \$anyDataDummyRegionSize],

+       '$zImageDummyCompressionRatio' => ["ZIMAGE Dummy Compression Ratio", \$zImageDummyCompressionRatio],

+       '$freeRAMSize' => ["Free RAM Size", \$freeRAMSize],

+       '$availableRAM' => ["Available RAM", \$availableRAM],

+       '$exceedROMSize' => ["Exceed ROM Size", \$exceedROMSize],

+       '$targetSplitSize' => ["Target Split Size", \$targetSplitSize],

+      );

+

+   my %objectLists =

+      (

+       '@rom1List' => ["ROM1 List", \@rom1List, '$rom1RegionSize',],

+       '@zImageList' => ["ZIMAGE List", \@zImageList, '$zImageRegionSize',],

+       '@anyCodeDummyList' => ["ANY_CODE Dummy List", \@anyCodeDummyList, '$anyCodeDummyRegionSize', '$anyCodeDummyRegionPadding'],

+       '@anyDataDummyList' => ["ANY_DATA Dummy List", \@anyDataDummyList, '$anyDataDummyRegionSize', '$anyDataDummyRegionPadding']

+      );

+

+   printLog("Get dummy scatter object lists");

+   {

+      # Basic

+      &_inputObjectListFromFile($objectROM1DummyListFile, \@rom1List, "ROM1");

+      &_inputObjectListFromFile($objectZImageDummyListFile, \@zImageList, "ZIMAGE");

+

+      # To be added

+      $anyCodeDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_CODE", \@anyCodeDummyList, "+RO-CODE", "ANY_CODE list");

+      $anyDataDummyRegionPadding = &_inputObjectListFromExecutionRegion("ZIMAGE_DUMMY_DATA", \@anyDataDummyList, "+RO-DATA", "ANY_DATA list");

+   }

+

+   printLog("Get size information");

+   {

+      $rom1DummyRegionSize = &_getExecutionRegionInfo("ROM1", "actual_size");

+      $zImageDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_ER", "actual_size");

+      $anyCodeDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_CODE", "actual_size");

+      $anyDataDummyRegionSize = &_getExecutionRegionInfo("ZIMAGE_DUMMY_DATA", "actual_size");

+

+      $rom1RegionSize = $rom1DummyRegionSize;

+      $zImageRegionSize = $zImageDummyRegionSize;

+

+      $freeRAMSize = &getFreeRAMSize();

+

+      $exceedROMSize = &getExceedROMSize();

+   }

+

+   # Configure

+   {

+      printLog("Compute Available RAM");

+      &_evaluateAssignment('$availableRAM = int(($freeRAMSize - $dcmcmpUsedRAM - $zImageDummyRegionSize) * (1 - $veneerReserveRatio))', \%variables);

+

+      if ($availableRAM < 0)

+      {

+         &configFail(CONFIG_FAIL_INSUFFICIENT_RAM, -1 * $availableRAM);

+      }

+

+      # Compute the compression ratios

+      printLog("Compute the compression ratios");

+      {

+         $zImageDummyCompressionRatio = &_getCompressionRatio("ZIMAGE", $zImageDummyRegionSize + $anyCodeDummyRegionSize + $anyDataDummyRegionSize, $zImageBinary);

+      }

+

+      # Push ANY_DATA to ZIMAGE

+      &_splitObjectListAndPushByExceedROM('@anyDataDummyList', '@zImageList', '@rom1List',

+                                          '$zImageDummyCompressionRatio', \%variables, \%objectLists);

+

+      # Push ANY_CODE to ZIMAGE

+      &_splitObjectListAndPushByExceedROM('@anyCodeDummyList', '@zImageList', '@rom1List',

+                                          '$zImageDummyCompressionRatio', \%variables, \%objectLists);

+

+      #if ($exceedROMSize > 0)

+      #{

+      #   &configFail(CONFIG_FAIL_INSUFFICIENT_FLASH_SIZE, $exceedROMSize);

+      #}

+

+      printLog("Compute the Max Compressed Size");

+      {

+         $zImageMaxCompressedSize = &_getRegionMaxCompressedSize("ZIMAGE", $zImageRegionSize, $zImageDummyRegionSize + $anyCodeDummyRegionSize + $anyDataDummyRegionSize, $zImageBinary);

+      }

+

+      $zImageMaxCompressedSize =

+         &vivaHelper::RoundDownToAlignment($zImageMaxCompressedSize, $zImageSizeAlignment);

+

+      printLog("ZIMAGE Max Compressed Size: ".vivaHelper::DecToHex($zImageMaxCompressedSize));

+   }

+

+   # Check whether the configurations are changed

+   {

+      if ($featureConfig{"CONFIG_ZIMAGE_MAX_COMPRESSED_SIZE"} == $zImageMaxCompressedSize)

+      {

+         debugLog("Config not changed");

+         $configChanged = 0;

+      }

+      else

+      {

+         debugLog("Config changed");

+         $configChanged = 1;

+      }

+

+      if (&_isObjectListChanged($objectROM1ListFile, \@rom1List) or

+          &_isObjectListChanged($objectZImageListFile, \@zImageList))

+      {

+         debugLog("Object list changed");

+         $objectListChanged = 1;

+      }

+      else

+      {

+         debugLog("Object list not changed");

+         $objectListChanged = 0;

+      }

+   }

+

+   return ($configChanged, $objectListChanged);

+}

+

+sub _getCompressionRatio

+{

+   my $regionName = shift;

+   my $dummyRegionSize = shift;

+   my $dummyCompressedBinary = shift;

+

+   my $dummyCompressedSize = -s $dummyCompressedBinary or

+      &vivaHelper::ErrorHandler("Cannot get file size $dummyCompressedBinary: $!", __FILE__, __LINE__);

+   #debugLog("$regionName Dummy Region Size = $dummyRegionSize");

+   #debugLog("$regionName Dummy Compressed Binary Size = $dummyCompressedSize");

+

+   my $compressionRatio = $dummyCompressedSize / $dummyRegionSize;

+   debugLog("$regionName Compression Ratio = $regionName Dummy Compressed Binary Size / $regionName Dummy Region Size");

+   debugLog("   = $dummyCompressedSize / $dummyRegionSize");

+   debugLog("   = $compressionRatio");

+

+   return $compressionRatio;

+}

+

+sub _splitObjectListAndPushByExceedROM

+{

+   my $sourceList = shift;

+   my $firstList = shift;

+   my $secondList = shift;

+

+   my $compressionRatio = shift;

+

+   my $variables = shift;

+   my $objectLists = shift;

+

+   if (${$variables->{'$exceedROMSize'}[1]} > 0)

+   {

+      printLog("Split $objectLists->{$sourceList}[0] to $objectLists->{$firstList}[0] and $objectLists->{$secondList}[0]");

+

+      &_evaluateAssignment('$targetSplitSize = min($availableRAM, '."$objectLists->{$sourceList}[2]".')', $variables);

+      &_evaluateAssignment('$targetSplitSize = min($targetSplitSize, int($exceedROMSize / (1 - '."$compressionRatio".')))', $variables);

+

+      ${$variables->{'$targetSplitSize'}[1]} = &_splitObjectListAndPush("$sourceList", "$firstList", "$secondList",

+                                                                        '$targetSplitSize', $variables, $objectLists);

+

+      &_evaluateAssignment('$availableRAM = $availableRAM - $targetSplitSize - '."$objectLists->{$sourceList}[3]", $variables);

+      &_evaluateAssignment('$exceedROMSize = int($exceedROMSize - $targetSplitSize * (1 - '."$compressionRatio".'))', $variables);

+   }

+   else

+   {

+      printLog("Push $objectLists->{$sourceList}[0] to $objectLists->{$secondList}[0]");

+      &_pushToObjectList($secondList, $sourceList, $variables, $objectLists);

+   }

+}

+

+#****************************************************************************

+# subroutine:  parseFeatureConfigFile

+# description: Get the settings in the feature config file

+# input:       The setting hash ref

+# output:      The settings

+#****************************************************************************

+sub parseFeatureConfigFile

+{

+   my $featureConfigRef = shift;

+   my $filename = $featureConfigFilePath;

+

+   open my $input, "<$filename" or

+      &vivaHelper::ErrorHandler("Cannot open file $filename: $!", __FILE__, __LINE__);

+

+   while (<$input>)

+   {

+      chomp;

+      if (/^\s*\#define\s+(\S+)\s+(\S+)/)

+      {

+         $featureConfigRef->{$1} = hex($2);

+      }

+   }

+

+   close $input;

+}

+

+#****************************************************************************

+# subroutine:  getFreeRAMSize

+# description: Get the free RAM size.

+# input:       None

+# output:      Free RAM size

+#****************************************************************************

+sub getFreeRAMSize

+{

+   # TODO: Move this to LISInfo.pm

+   my $externalRAMSize = &getExternalRAMSize();

+   my $usedRAM;

+   my $cacheDummyEndSize = 4;

+   my $result;

+

+   my %regionInfo;

+   &vivaHelper::GetLISExecutionRegionInfo("DYNAMIC_CACHEABLE_EXTSRAM_DEFAULT_CACHEABLE_ZI", \%regionInfo);

+   $usedRAM = ($regionInfo{"base_address"} & hex("0x07FFFFFF")) + $regionInfo{"actual_size"};

+   debugLog("End of cacheable ZI = $usedRAM");

+

+   &vivaHelper::GetLISExecutionRegionInfo("EXTSRAM_DSP_TX", \%regionInfo);

+   $usedRAM += $regionInfo{"max_size"};

+   debugLog("DSP TX RAM = ".$regionInfo{"max_size"});

+

+   &vivaHelper::GetLISExecutionRegionInfo("EXTSRAM_DSP_RX", \%regionInfo);

+   $usedRAM += $regionInfo{"max_size"};

+   debugLog("DSP RX RAM = ".$regionInfo{"max_size"});

+

+   debugLog("Cache dummy end size = $cacheDummyEndSize");

+

+   $result = $externalRAMSize - $usedRAM - $cacheDummyEndSize;

+

+   debugLog("Free RAM size = External Total RAM Size - (End of cacheable ZI + DSP TX RAM + DSP RX RAM) - Cache Dummy End Size");

+   debugLog("   = $result");

+

+   return $result;

+}

+

+#****************************************************************************

+# subroutine:  getTotalLISROMSize

+# description: Get total ROM size in LIS file.

+# input:       None

+# output:      Total ROM size in LIS file

+#****************************************************************************

+sub getTotalLISROMSize

+{

+   my %totalSizeInfo;

+   &vivaHelper::GetLISTotalSize(\%totalSizeInfo);

+

+   my $totalLISROMSize = $totalSizeInfo{"ROM"};

+

+   debugLog("Total LIS ROM size = $totalLISROMSize");

+

+   return $totalLISROMSize;

+}

+

+#****************************************************************************

+# subroutine:  getFileSystemBaseAddress

+# description: Get the file system base address.

+# input:       None

+# output:      File system base address

+#****************************************************************************

+sub getFileSystemBaseAddress

+{

+   my $result;

+

+   open my $input, "<$flashConfigFilePath" or

+      &vivaHelper::ErrorHandler("Cannot open file $flashConfigFilePath: $!", __FILE__, __LINE__);

+

+   while (<$input>)

+   {

+     if (/int flash_base_address\s+=\s+((\S|\s)+);/)

+     {

+       $result = eval($1);

+       last;

+     }

+   }

+   close ($input);

+

+   debugLog("File System Base Address = $result");

+

+   return $result;

+}

+

+#****************************************************************************

+# subroutine:  getExceedROMSize

+# description: Get the bytes exceed maximum ROM size.

+# input:       None

+# output:      Byte exceeded

+#****************************************************************************

+sub getExceedROMSize

+{

+   my $fsBaseAddress = &getFileSystemBaseAddress();

+   my $totalLISROMSize = &getTotalLISROMSize();

+   my $scatterReservedSize = &vivaHelper::GetScatterReservedSize($fsBaseAddress);

+   debugLog("Scatter Reserved Size = $scatterReservedSize");

+

+   my $exceedROMSize = $totalLISROMSize + $scatterReservedSize - $fsBaseAddress;

+

+   debugLog("Exceed ROM Size = Total LIS ROM size + Scatter Reserved Size - File System Base Address");

+   debugLog("   = $totalLISROMSize + $scatterReservedSize - $fsBaseAddress");

+   debugLog("   = $exceedROMSize");

+

+   return $exceedROMSize;

+}

+

+#****************************************************************************

+# subroutine:  getExternalRAMSize

+# description: Get the external RAM size.

+# input:       None

+# output:      External RAM size

+#****************************************************************************

+sub getExternalRAMSize

+{

+   my $filename = "$customFolder\\custom_EMI_release.h";

+   my $result;

+

+   open my $input, "<$filename" or

+      &vivaHelper::ErrorHandler("Cannot open file $flashConfigFilePath: $!", __FILE__, __LINE__);

+

+   while (<$input>)

+   {

+     if (/\#define EMI_EXTSRAM_SIZE ((\S|\s)+)/)

+     {

+       $result = eval($1);

+       last;

+     }

+   }

+   close ($input);

+

+   debugLog("External Total RAM Size =  $result");

+

+   return $result;

+}

+

+#****************************************************************************

+# subroutine:  isAutoConfigEnable

+# description: See if the auto configuration mechanism is enabled or not.

+# input:       None

+# output:      1: enabled; 0: not enabled

+#****************************************************************************

+sub isAutoConfigEnable

+{

+   my $autoConfig = &vivaHelper::GetMakefileOption("ZIMAGE_AUTO_CONFIG");

+

+   if (not defined $autoConfig or $autoConfig eq "TRUE")

+   {

+      return 1;

+   }

+   else

+   {

+      return 0;

+   }

+}

+

+#****************************************************************************

+# subroutine:  printIntermediateFile

+# description: Print to intermediate file.

+# input:       Message

+# output:      None

+#****************************************************************************

+sub printIntermediateFile

+{

+   my $message = shift;

+

+   open my $output, ">$intermediateFilePath" or

+      &vivaHelper::ErrorHandler("Cannot open file $intermediateFilePath: $!", __FILE__, __LINE__);

+

+   print $output $message;

+

+   close $output;

+}

+

+#****************************************************************************

+# subroutine:  configFailLog

+# description: Output the config fail information.

+# input:       Fail reason message, recommendation message

+# output:      None

+#****************************************************************************

+sub configFailLog

+{

+   my ($failReason, $recommend) = @_;

+

+   my $message = "Error: $failReason\nRecommend: $recommend\n";

+   printLog("\n$message");

+

+   open (FILE_HANDLE, ">$intermediateFilePath") or

+      &vivaHelper::ErrorHandler("Cannot open file $intermediateFilePath: $!", __FILE__, __LINE__);

+   print FILE_HANDLE $message;

+   close FILE_HANDLE;

+

+   exit ERR::CANNOT_ADJUST;

+}

+

+#****************************************************************************

+# subroutine:  configFail

+# description: Indicate the configuration is failed.

+# input:       Fail code (constant with CONFIG_FAIL_XXXX)

+# output:      None

+#****************************************************************************

+sub configFail

+{

+   my $failCode = shift;

+   my $failReason;

+   my $recommend;

+

+   if ($failCode == CONFIG_FAIL_INSUFFICIENT_RAM)

+   {

+      my $exceeded = shift;

+      $failReason = "Insufficient RAM space. ($exceeded bytes exceeded)";

+      $recommend = "Please turn off some features. (e.g. DCM_COMPRESSION_SUPPORT)";

+   }

+   elsif ($failCode == CONFIG_FAIL_ZIMAGE_OVERFLOW)

+   {

+      my $exceeded = shift;

+      $failReason = "ZIMAGE overflow. ($exceeded bytes exceeded)";

+      $recommend = "Please either\n           (1) remove xxx.lib/xxx.obj from ZIMAGE, or\n           (2) turn off some features"

+   }

+   elsif ($failCode == CONFIG_FAIL_FEATURE_NOT_ENABLED)

+   {

+      $failReason = "No configurable feature is enabled.";

+      $recommend = "Please turn off some features and refer to build\\[BB]\\VIVA_DEBUG\\[BB].error for more information.";

+   }

+   elsif ($failCode == CONFIG_FAIL_NO_CONFIG_CHANGED)

+   {

+      $failReason = "The configuration is not changed.";

+      $recommend = "Please turn off some features."

+   }

+   elsif ($failCode == CONFIG_FAIL_INSUFFICIENT_FLASH_SIZE)

+   {

+      my $exceeded = shift;

+      $failReason = "Insufficient flash space. ($exceeded bytes exceeded)";

+      $recommend = "Please turn off some features."

+   }

+   elsif ($failCode == CONFIG_FAIL_INSUFFICIENT_RAM_FOR_BOOT_ZIMAGE)

+   {

+      my $exceeded = shift;

+      $failReason = "Insufficient RAM space for BOOT_ZIMAGE. ($exceeded bytes exceeded)";

+      $recommend = "Please turn off some features. (e.g. DCM_COMPRESSION_SUPPORT)";

+   }

+   else

+   {

+      $failReason = "Unknown.";

+      $recommend = "Please call for help";

+   }

+

+   &configFailLog($failReason, $recommend);

+}

+

+#****************************************************************************

+# subroutine:  min

+# description: Get the minimum one in the two input.

+# input:       Number 1, number 2

+# output:      Minimum number

+#****************************************************************************

+sub min

+{

+    my ($m, $n) = @_;

+

+    if ($m < $n) {

+        $m

+    }

+    else {

+        $n

+    }

+}

+

+#****************************************************************************

+# subroutine:  getTimeStamp

+# description: Get a time stamp.

+# input:       None

+# output:      The time stamp

+#****************************************************************************

+sub getTimeStamp

+{

+   return time().".".int(rand(1000));

+}

+

+

+#****************************************************************************

+# subroutine:  backupFile

+# description: Backup file with a timestamp appended.

+# input:       Filename

+# output:      None

+#****************************************************************************

+sub backupFile

+{

+   my $filename = shift;

+   my $backupFilename = $filename.".beforeAutoAdj".getTimeStamp();

+

+   copy($filename, $backupFilename) or

+      &vivaHelper::ErrorHandler("Cannot backup file $filename: $!", __FILE__, __LINE__);

+}

+

+

+sub printLog

+{

+   print "$_[0]\n";

+}

+

+sub debugLog

+{

+   if ($DEBUG)

+   {

+      printLog("\t$_[0]");

+   }

+}

+

+# DEBUG command

+# tools\vivaConfig.pl .\build\KHAN50D_V11_DEMO\VIVA_DEBUG\KHAN50D_V11_DEMO_PCB01_gprs_MT6250_S00.lis.dummy .\build\KHAN50D_V11_DEMO\VIVA_DEBUG\KHAN50D_V11_DEMO_PCB01_gprs_MT6250_S00.MAUI_11BW1132SP_W12_15.bin_dummy .\custom\system\KHAN50D_V11_DEMO_BB .\make\KHAN50D_V11_DEMO_GPRS.mak ~flash_cfg_tmp.c intermediate.log aapmc.log > build\KHAN50D_V11_DEMO\log\vivaConfig.log