Preempting Tokens
There are families of tools that use different numbers of tokens per license. The number of tokens used depends on the application. For example, the family Cadence Multi-Mode simulators contains tools such as Spectre, AMS, and UltraSim, using 1, 2, and 6 tokens respectively. These families of tools require special attention when configuring preemption.
In the following examples, it is assumed there are eight groups of users (My1, ...,
                My8) competing for the tokens, represented by the resource map
                    MyTokens. It is also assumed that the jobs are assigned to
                different jobclasses: spectre,
                    ams, and ultrasim. 
- Based on priority, restricted to jobs belonging to the same user
- Based on ownership
- Based on avoiding starvation of multi-token jobs by reserving tokens
Priority-based Preemption for Tokens
MyTokens resource. Jobs
                younger than 20 seconds are killed and resubmitted; they are not suspended or
                resumed.
                    # Fragment of vnc.swd/vovpreemptd/config.tcl
    VovPreemptRule -rulename MyPriSameUser \
        -preempting "priority>=8" \
        -waitingfor MyTokens \
        -preemptable "jobclass==@JOBCLASS@ user==@USER@ priority<4" \
        -killage 20 \
        -pool contract:My
The only difference between the preemption on tokens and the preemption on regular
                license is the use of the pool contract:My. This pool is used for
                the rules based on Ownership, which is described in the following section. In a
                given preemption cycle, the ownership rules will not fire if the
                    MyPriSameUserK rule is fired. 
Avoid Starvation for Tokens
With mixed workloads of spectre and ultrasim jobs,
                it is difficult for an ultrasim job to be scheduled. It is also
                difficult for six tokens to be available at the same time, as
                    spectre jobs will likely take all the tokens as the tokens
                become available. This starvation for the ultrasim jobs can
                be prevented by reserving tokens for the ultrasim jobs as described
                in the following example. 
In this example, for jobs in the ultrasim class, if a job that has
                at least normal priority and has been waiting for more than 2 minutes, 6 tokens are
                reserved for the top job for a period of 1 minute. As this reservation is renewed at
                every cycle, the reservation period does not need to be long. A subordinate rule in
                the same pool takes care of the jobs in the ams class. 
- The resource reservations for a specific job are automatically dismissed when the job is no longer in the queue because it is either dispatched or descheduled.
- It is not necessary to specify the resources to be reserved, as that is automatically computed.
My:reserve, is used for both
                    ultrasim and ams. This is to not have both
                rules to fire in each cycle. Having reserved tokens for the
                    ultrasim jobs, it is not desirable to also reserve tokens for
                    ams, as ams would likely prevail.
                # Fragment of vnc.swd/vovpreemptd/config.tcl
VovPreemptRule -rulename MyAntiStarvationUltrasim \
    -preempting "jobclass==ultrasim priority>=4" \
    -bucketage  "2m" \
    -method  "RESERVE" \
    -reservetime  1m -reservenum 6 \
    -pool "My:reserve"
VovPreemptRule -rulename MyAntiStarvationAms \
    -preempting "jobclass==ams priority>=4" \
    -bucketage  "2m" \
    -method  "RESERVE" \
    -reservetime  1m -reservenum 2 \
    -pool "My:reserve"