// Copyright(c) 2009-2013 Accellera Systems Initiative Inc.
// 1370 Trancas Street #163, Napa, CA 94558, USA.
//
// The material in disciplines.vams is an essential part of the Accellera Systems
// Initiative ("Accellera") Verilog-AMS Language Standard. Verbatim copies of
// the material in this Annex may be used and distributed without restriction.
// All other uses require permission from Accellera IP Committee
// (ipr-chair@lists.accellera.org).
// All other rights reserved.

`ifdef DISCIPLINES_VAMS
`else
`define DISCIPLINES_VAMS 1

//
// Natures and Disciplines
//

discipline \logic ; 
    domain discrete;
enddiscipline 

discipline ddiscrete; 
    domain discrete; 
enddiscipline 

/*
 *   Default absolute tolerances may be overridden by setting the
 *   appropriate _ABSTOL prior to including this file
 */

// Electrical

// Current in amperes
nature Current; 
    units        = "A";
    access       = I;
    idt_nature   = Charge;
`ifdef CURRENT_ABSTOL
    abstol       = `CURRENT_ABSTOL;
`else
    abstol       = 1e-12;
`endif
endnature 

// Charge in coulombs
nature Charge; 
    units      = "coul";
    access     = Q;
    ddt_nature = Current;
`ifdef CHARGE_ABSTOL
    abstol     = `CHARGE_ABSTOL;
`else
    abstol     = 1e-14;
`endif
endnature

// Potential in volts
nature Voltage; 
    units      = "V";
    access     = V;
    idt_nature = Flux;
`ifdef VOLTAGE_ABSTOL
    abstol     = `VOLTAGE_ABSTOL;
`else
    abstol     = 1e-6;
`endif
endnature 

// Flux in Webers
nature Flux; 
    units      = "Wb";
    access     = Phi;
    ddt_nature = Voltage;
`ifdef FLUX_ABSTOL
    abstol     = `FLUX_ABSTOL;
`else
    abstol     = 1e-9;
`endif
endnature

// Conservative discipline
discipline electrical; 
    potential    Voltage;
    flow         Current;
enddiscipline

// Signal flow disciplines
discipline voltage; 
    potential    Voltage;
enddiscipline

discipline current; 
    flow    Current;
enddiscipline

// Magnetic

// Magnetomotive force in Ampere-Turns.
nature Magneto_Motive_Force; 
    units      = "A*turn";
    access     = MMF;
`ifdef MAGNETO_MOTIVE_FORCE_ABSTOL
    abstol     = `MAGNETO_MOTIVE_FORCE_ABSTOL;
`else
    abstol     = 1e-12;
`endif
endnature

// Conservative discipline
discipline magnetic; 
    potential    Magneto_Motive_Force;
    flow         Flux;
enddiscipline

// Thermal

// Temperature in Kelvin
nature Temperature; 
    units      = "K";
    access     = Temp;
`ifdef TEMPERATURE_ABSTOL
    abstol     = `TEMPERATURE_ABSTOL;
`else
    abstol     = 1e-4;
`endif
endnature

// Power in Watts
nature Power; 
    units      = "W";
    access     = Pwr;
`ifdef POWER_ABSTOL
    abstol     = `POWER_ABSTOL;
`else
    abstol     = 1e-9;
`endif
endnature

// Conservative discipline
discipline thermal; 
    potential    Temperature;
    flow         Power;
enddiscipline

// Kinematic

// Position in meters
nature Position; 
    units      = "m";
    access     = Pos;
    ddt_nature = Velocity;
`ifdef POSITION_ABSTOL
    abstol     = `POSITION_ABSTOL;
`else
    abstol     = 1e-6;
`endif
endnature

// Velocity in meters per second
nature Velocity; 
    units      = "m/s";
    access     = Vel;
    ddt_nature = Acceleration;
    idt_nature = Position;
`ifdef VELOCITY_ABSTOL
    abstol     = `VELOCITY_ABSTOL;
`else
    abstol     = 1e-6;
`endif
endnature

// Acceleration in meters per second squared
nature Acceleration; 
    units      = "m/s^2";
    access     = Acc;
    ddt_nature = Impulse;
    idt_nature = Velocity;
`ifdef ACCELERATION_ABSTOL
    abstol     = `ACCELERATION_ABSTOL;
`else
    abstol     = 1e-6;
`endif
endnature

// Impulse in meters per second cubed
nature Impulse; 
    units      = "m/s^3";
    access     = Imp;
    idt_nature = Acceleration;
`ifdef IMPULSE_ABSTOL
    abstol     = `IMPULSE_ABSTOL;
`else
    abstol     = 1e-6;
`endif
endnature

// Force in Newtons
nature Force; 
    units      = "N";
    access     = F;
`ifdef FORCE_ABSTOL
    abstol     = `FORCE_ABSTOL;
`else
    abstol     = 1e-6;
`endif
endnature

// Conservative disciplines
discipline kinematic; 
    potential    Position;
    flow         Force;
enddiscipline

discipline kinematic_v; 
    potential    Velocity;
    flow         Force;
enddiscipline

// Rotational

// Angle in radians
nature Angle; 
    units      = "rads";
    access     = Theta;
    ddt_nature = Angular_Velocity;
`ifdef ANGLE_ABSTOL
    abstol     = `ANGLE_ABSTOL;
`else
    abstol     = 1e-6;
`endif
endnature

// Angular Velocity in radians per second
nature Angular_Velocity; 
    units      = "rads/s";
    access     = Omega;
    ddt_nature = Angular_Acceleration;
    idt_nature = Angle;
`ifdef ANGULAR_VELOCITY_ABSTOL
    abstol     = `ANGULAR_VELOCITY_ABSTOL;
`else
    abstol     = 1e-6;
`endif
endnature

// Angular acceleration in radians per second squared
nature Angular_Acceleration; 
    units      = "rads/s^2";
    access     = Alpha;
    idt_nature = Angular_Velocity;
`ifdef ANGULAR_ACCELERATION_ABSTOL
    abstol     = `ANGULAR_ACCELERATION_ABSTOL;
`else
    abstol     = 1e-6;
`endif
endnature

// Torque in Newtons
nature Angular_Force; 
    units      = "N*m";
    access     = Tau;
`ifdef ANGULAR_FORCE_ABSTOL
    abstol     = `ANGULAR_FORCE_ABSTOL;
`else
    abstol     = 1e-6;
`endif
endnature
// Conservative disciplines
discipline rotational; 
    potential    Angle;
    flow         Angular_Force;
enddiscipline
discipline rotational_omega; 
    potential    Angular_Velocity;
    flow         Angular_Force;
enddiscipline
`endif
