[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