Advanced Jobclass for ADE Jobs

In the directory $VOVDIR/etc/jobclass/examples you can find an advanced jobclass for ADE jobs called spectre_ade.tcl. To deploy this jobclass you can do this:

% cd `nc cmd vovserverdir -p jobclass`
% cp $VOVDIR/etc/jobclass/examples/spectre_ade.tcl.
% vi spectre_ade.tcl 

File: spectre_ade.tcl

# Original Documentation about MMSIM.
set MMSIMDOC {

Simulator solver        RF      turbo   parasitics level         tokens
--------- -----------   ------- ------  ---------  -------      ---------
Spectre   Spectre       N       N       N       spectre L       1
          Spectre       N       Y       N       spectre XL      2
          Spectre       N       N       Y       spectre GXL     4
          Spectre       N       Y       Y       spectre GXL     4
SpectreRF Spectre       Y       N       N       spectre XL      2
          Spectre       Y       N       Y       spectre GXL     4
          Spectre       Y       Y       N       spectre GXL     4
          Spectre       Y       Y       Y       spectre GXL     4
Ultrasim  Ultrasim      N/A     N/A     N       Ultrasim L      4
          Ultrasim      N/A     N/A     Y       Ultrasim XL     6
AMS       Spectre       N/A     N       N       AMS+Spectre L   3
          Spectre       N/A     Y       N       AMS+Spectre XL  4
          Spectre       N/A     N       Y       AMS+Spectre GXL 6
          Spectre       N/A     Y       Y       AMS+Spectre GXL 6
          Ultrasim      N/A     N/A     N       AMS+Ultrasim L  6
          Ultrasim      N/A     N/A     Y       AMS+Ultrasim XL 8 

AMS-APS:  4 tokens + number of tokens in chart below.

Basically the AMS mmsim token # equals 2 + mmsim (spectre L/XL/GXL, or usim L/XL) tokens

In MMSIM 7.2 APS licensing using 90003 is:

1-4 Cores takes 4 tokens.
5-16 Cores take 6 tokens.
APS-RF takes 6 tokens.

APS was released in MMSIM7.1 (and not available in MMSIM7.0).  
If you are using MMSIM 7.1, the licensing for APS using 90002 tokens is this:

APS   #Elements  #Threads     #Tokens
    <=75K        1-4        4 tokens (see Note 1)
    <=75K        5-8        8 tokens (see Note 2)
     >75K        1-4        8 tokens (see Note 3)
     >75K        5-8        12 tokens (see Note 4) 

Note 1: APS L license OR APS XL license OR 4 tokens
Note 2: 2 APS L licenses OR APS XL license OR 8 tokens
Note 3: APS XL license OR 8 tokens(2 APS L licenses not allowed)
Note 4: APS XL+L license OR 2 APS XL licenses OR 12 tokens (2 APS L licenses not allowed)

The APS license process is (MMSIM 7.1):

1. The APS L license or 4 tokens are checked out since circuit size is unknown
2. Once the circuit size is detected, APS L license or 4 tokens are checked in, and the 
   appropriate license/number of tokens is checked out.

}

proc checkRunCommand {{file "runCommand"}} {
    # This procedure examines the runCommand file created by ADE
    # and tries to compute the number of license tokens needed.

    # It is important to be correct so that we do not
    #  - reduce throughput by queueing jobs when licenses are available
    #  - cause license errors by launching jobs when no licenses available

    # Examples of what we may expect in the runCommand file.
    # The \ indicates that the content is all on one line

    # spectre input.ics +iscchars +log ../psf/spectre.out  -format sst2 -raw \
                                                #   ../psf +turbo +lqtimeout 0 -maxw 5 -maxn 5 +lsuspend +lqt 0 +lqs 30

    # spectre input.scs +escchars +log ../psf/spectre.out  -format sst2 -raw \
                                                #   ../psf +aps +lqtimeout 0 -maxw 5 -maxn 5 +lsuspend

    global VOV_JOB_DESC
    # Use a variable for the (long) license name
    # IMPORTANT: change this if you use a non-default name for MMSIM license
    set lictok "License:Virtuoso_Multi_mode_Simulation"

    # Initialize flags
    set hasRF    0
    set hasTurbo 0
    set hasAPS   0
    set tool    ""
    set threadNum 1
    set hasRunCommand 0

    if { [file exists $file] } {
        if { [catch {set ifp [open $file "r"] } opnmsg] } {
            # complain, but do not return, fall into default case below
            VovError "opening run-cmd file '$file'  -- $opnmsg"
        } else {
            set cmd [read $ifp]
            catch {close $ifp}
            set hasRunCommand 1 
            set tool [shift cmd] ; # usually 'spectre'
            # examine the arguments
            while { $cmd != {} } {
                set a [shift cmd]
                switch -glob -- $a {
                    "++aps" -
                    "+aps"   { set hasAPS   1 }
                    "-aps"   { set hasAPS   0 }
                    "+turbo" { set hasTurbo 1 }
                    "-turbo" { set hasTurbo 0 }
                    "+multithread=*" { set threadNum [string range $a 13 end] }
                    "+mt=*"          { set threadNum [string range $a  4 end] }
                    "-multithread" - "-mt" { set threadNum 1 }
                }
            }
        }
    } else {
        VovMessage "run-cmd file does not exist -- '$file'" 3
    }

    # For now, we only cover the spectre case (below, handy line for cut/paste)
    ##### License:Virtuoso_APS_MMSIM_Lk#6 
    ##### License:Virtuoso_Multi_mode_Simulation#6 

    # Do not print this - confuses the interface code
    # puts "$hasRF-$hasTurbo-$hasAPS"

    # compute base number of tokens
    switch -glob "$hasRF-$hasTurbo-$hasAPS" {
        "*-*-1" -
        "1-1-0" {
            set tok_base 2
        }
        "1-0-0" -
        "0-1-0" {
            set tok_base 1
        }
        "0-0-0" -
        default {
            set tok_base 1
        }
    }

    if { $threadNum > 16 } {
        # We do not have doc about this case.  Should check with Cadence
        set tok_core 6
    } elseif { $threadNum >= 5 } {
        set tok_core 6
    } elseif { $threadNum >= 2 } {
        set tok_core 2
    } else {
        if { $hasAPS } {
            set tok_core 4
        } else {
            set tok_core 1
        }
    }
    set tok_tot [expr $tok_base + $tok_core]
    # license resource
    set    VOV_JOB_DESC(fstokens)  $tok_tot
    append VOV_JOB_DESC(resources) " ${lictok}\#$tok_tot "
    # CORES resource
    append VOV_JOB_DESC(resources) " CORES/$threadNum "

    append  VOV_JOB_DESC(resources) " Limit:spectre3_ade#$tok_tot"          ;# Limit for the whole job class.
    append  VOV_JOB_DESC(resources) " Limit:spectre3_ade_@USER@#$tok_tot"   ;# Limit for each user in this job class.
    return $hasRunCommand
}
###
### A jobclass for the jobs generated by Cadence ADE
###

set classDescription "Cadence ADE jobs"

# Use snapshot env for now, but we recommend using composite named environment.
set VOV_JOB_DESC(env)       "SNAPSHOT"
set VOV_JOB_DESC(group)     "/class/spectre_ade"
set VOV_JOB_DESC(legalExit) "0-137"
set VOV_JOB_DESC(priority,sched)  8
# set VOV_JOB_DESC(env)    "BASE+CADENCE"

# following is equivalent to -D on the command line
append  VOV_JOB_DESC(check,directory) 0

# check old and new command file names
set cmdfiles {"runSimulation" "runCommand"}
foreach cfn $cmdfiles {
    if { [file readable $cfn] } {
        break
    }
}

set hasRunCommand [checkRunCommand $cfn]

if { $hasRunCommand } {
    # nothing 
} else {
    # This tasker resource is to limit a host to one virtuoso
    #01jul2016 abb; comment out for now
    #append  VOV_JOB_DESC(resources) " virtuoso/1 "
}

##append  VOV_JOB_DESC(resources) " x86_64 RAM/200";   ## Other hardware requirements.
# parray VOV_JOB_DESC

proc initJobClass {} {
    vtk_resourcemap_set       Limit:spectre3_ade            24 
    vtk_resourcemap_set_limit Limit:spectre3_ade_@USER@     16
}
Warning: This is our best attempt to capture the number of tokens used by the various ADE tools, based on the command line in the ICRP scripts. Since Cadence may change their policies on tokens at any time, you may want to adapt the jobclass to your needs by using Altair Accelerator as a networkable directory. This may happen if it is on a non-exported filesystem, for example /tmp. To use Altair Accelerator well, the simulation run directories should be on networkable filesystems.