#ifndef _PrimEx_

   #define _PrimEx_


   #include <Windows.h>


   typedef void (CALLBACK* MSGPROC)(const char* pcszMessage);

   extern MSGPROC pfuncMessage;

   #define MESSAGE(pcszMessage) (*pfuncMessage)(pcszMessage)


   ////////////////////////////////////////////////////////////////////////////
   //
   // Structure:  stPrimPar
   //
   // Overview:   The structure of model's primitive. Currently it's a clone of
   //             PRIMPAR structure defined in Prim.h file.
   //
   ////////////////////////////////////////////////////////////////////////////

   typedef struct
   {
      WORD   wMask;          // Parameter level mask.
      char  *pszShortName;   // Abbreviated parameter name.
      char  *pszFullName;    // Full parameter name.
      float  flDefaultValue; // Parameter default value.
   } stPrimPar;


   ////////////////////////////////////////////////////////////////////////////
   //
   // Structure:  stPrimPin
   //
   // Overview:   The structure of model's pin.
   //
   ////////////////////////////////////////////////////////////////////////////

   typedef struct
   {
      char  *pszName; // Pin simulation name.
      int   eType,    // Pin simulation type.
            iIndex;   // Pin simulation index.
   } stPrimPin;


   ////////////////////////////////////////////////////////////////////////////
   //
   // Enumeration:   enmPrimPin
   //
   // Overview:      Lists all possible types of the pin.
   //
   ////////////////////////////////////////////////////////////////////////////

   enum enmPrimPinType
   {
      PT_NULL = 0,
      PT_IN,
      PT_OUT,
      PT_IO,
      PT_ANG
   };


   ////////////////////////////////////////////////////////////////////////////
   //
   // Structure:  stPrim
   //
   // Overview:   The base structure of the model.
   //
   ////////////////////////////////////////////////////////////////////////////

   typedef struct
   {
      char      *pszHelpFile,           // Help file name string.
                *pszHelpKey,            // Primitive help key string.
                *pszName;               // Primitive name string.
      int        iBidirect,             // Number of digital i/o pins.
                 iDataLength,           // Length of primitive work area in bytes.
                 iEntries,              // Number of analog pins.
                 iInputs,               // Number of digital input pins.
                 iInternalAnalogNodes,  // Number of internal analog nodes.
                 iInternalDigitalNodes, // Number of internal digital nodes.
                 iOutputs,              // Number of digital output pins.
                 nParams,               // Number of parameters.
                 nPins,                 // Number of pins (entries + inputs + outputs + bidirect).
                 iStatus;               // Primitive status.
      stPrimPar *pParameters;           // Primitive parameter table, size = params.
      stPrimPin *pPins;                 // Pin name table, size = pins.
   } stPrim;


   ////////////////////////////////////////////////////////////////////////////
   //
   // Primitive "status" field bit definition.
   //
   ////////////////////////////////////////////////////////////////////////////

   #define PS_INTGND     0x01 // Has internal connection to ground.
   #define PS_OVFTEST    0x02 // Iterated by linear-segment approximation.
   #define PS_MODEL      0x04 // CompValue is always a model name.
   #define PS_NONLINEAR  0x08 // Nonlinear, requires BP calc before AC sim.
   #define PS_MODEPAR    0x10 // Has grouped parameters using level mask.

#endif
