
printf("STARTING CDSINIT\n")

; load configuration skill scripts.
let( (configFileList file path saveSkillPath)
    configFileList = '(
                    )
    ; paths of the configuration files.
    path = strcat(
              ".  ~  "
              prependInstallPath("local ")
             )
    saveSkillPath=getSkillPath()
    setSkillPath(path)

    foreach(file configFileList
       if(isFile(file) then
          loadi(file)
         )
    )
    setSkillPath(saveSkillPath)
)

; load key bindings scripts
let( (bindKeyFileList file path saveSkillPath)
    bindKeyFileList = '(
                   "leBindKeys.il"
                   "schBindKeys.il"
                    )
    ; paths of key binding scripts
    path = strcat(
              ".  ~  "
              prependInstallPath("local ")
              prependInstallPath("samples/local")
             )
    saveSkillPath=getSkillPath()
    setSkillPath(path)

    foreach(file bindKeyFileList
       if(isFile(file ) then
          loadi(file)
         )
    )
    setSkillPath(saveSkillPath)
)

sstatus(writeProtect nil)

let((skillPath)
   skillPath= strcat(
    ". ~ "                                          ; Current & home directory
    prependInstallPath("samples/techfile ")         ; sample source technology files
   )
   setSkillPath(skillPath)
)

;
; check CALIBRE_HOME
;
cal_home=getShellEnvVar("CALIBRE_HOME")
if( cal_home==nil then
    cal_home=getShellEnvVar("MGC_HOME")
    if( cal_home!=nil then
        printf("// CALIBRE_HOME environment variable not set; setting it to value of MGC_HOME\n");
    )
)

if( cal_home!=nil && isDir(cal_home) && isReadable(cal_home) then

    ; Load calibre.skl or calibre.4.3.skl, not both!

    if( getShellEnvVar("MGC_CALIBRE_REALTIME_VIRTUOSO_ENABLED") &&
        getShellEnvVar("MGC_REALTIME_HOME") && dbGetDatabaseType()=="OpenAccess" then
      load(strcat(getShellEnvVar("MGC_REALTIME_HOME") "/lib/calibre.skl"))
    else
      ; Load calibre.skl for Cadence versions 4.4 and greater
      load(strcat(cal_home "/lib/calibre.skl"))
    )

    ;;;;Load calibre.4.3.skl for Cadence version 4.3
    ;;; load(strcat(cal_home "/lib/calibre.4.3.skl"))

else

    ; CALIBRE_HOME is not set correctly. Report the problem.

    printf("//  Calibre Error: Environment variable ")

    if( cal_home==nil || cal_home=="" then
        printf("CALIBRE_HOME is not set.");
    else
        if( !isDir(cal_home) then
            printf("CALIBRE_HOME does not point to a directory.");
        else
            if( !isReadable(cal_home) then
                printf("CALIBRE_HOME points to an unreadable directory.");
            )
        )
    )
    printf(" Calibre Skill Interface not loaded.\n")

    ; Display a dialog box message about load failure.

    hiDisplayAppDBox(
        ?name           'MGCHOMEErrorDlg
        ?dboxBanner     "Calibre Error"
        ?dboxText       "Calibre Skill Interface not loaded."
        ?dialogType     hicErrorDialog
        ?dialogStyle    'modal
       ?buttonLayout   'Close
    )
)

printf("END OF STANDARD CONFIG SETTINGS\n")

; set default editor
editor = "emacs"

envLoadFile( "./.cdsenv" )

if( isFile( ".cdsenv.personal" ) then
    envLoadFile( ".cdsenv.personal" )
)

cdlOutKeys = list(nil
    'incFILE                   "$BAG_TECH_CONFIG_DIR/calibre_setup/source.added"
)

if( isFile( ".cdsinit.personal" ) then
    load(".cdsinit.personal")
)

; open library manager
ddsOpenLibManager()


;; Set Default Model Files.  Note the "#;" de-selects the model call.

setModelFiles=strcat(
   " " getShellEnvVar("PDK_HOME") "MODELS/SPECTRE" getShellEnvVar("METAL_STACK") "/Models/design_wrapper.lib.scs;tt_fet"
   " " getShellEnvVar("PDK_HOME") "MODELS/SPECTRE/" getShellEnvVar("METAL_STACK") "/Models/design_wrapper.lib.scs;tt_cell"
   " " getShellEnvVar("PDK_HOME") "MODELS/SPECTRE/" getShellEnvVar("METAL_STACK") "/Models/design_wrapper.lib.scs;tt_parRC"
   " " getShellEnvVar("PDK_HOME") "MODELS/SPECTRE/" getShellEnvVar("METAL_STACK") "/Models/design_wrapper.lib.scs;tt_rc"
   " " getShellEnvVar("PDK_HOME") "MODELS/SPECTRE/" getShellEnvVar("METAL_STACK") "/Models/design_wrapper.lib.scs;npn_t"
)
envSetVal("spectre.envOpts" "modelFiles" 'string setModelFiles)
envSetVal("spectre.envOpts" "controlMode" 'string "batch")


printf("END OF CUSTOM CONFIG SETTINGS\n")
