2 changed files with 248 additions and 0 deletions
-
202src/xspice/icm/analog/multi_input_pwl/cfunc.mod
-
46src/xspice/icm/analog/multi_input_pwl/ifspec.ifs
@ -0,0 +1,202 @@ |
|||
/*.......1.........2.........3.........4.........5.........6.........7.........8 |
|||
================================================================================ |
|||
|
|||
FILE multi_input_pwl/cfunc.mod |
|||
|
|||
Copyright 2005 |
|||
Intrinsity, Inc. Austin, TX 78738 |
|||
All Rights Reserved |
|||
|
|||
AUTHORS |
|||
|
|||
20 Oct 2005 Phil Barker |
|||
|
|||
|
|||
MODIFICATIONS |
|||
|
|||
20 Oct 2005 Phil Barker |
|||
|
|||
|
|||
SUMMARY |
|||
|
|||
This file contains the model-specific routines used to |
|||
functionally describe the multi-input gate pwl. |
|||
|
|||
|
|||
INTERFACES |
|||
|
|||
FILE ROUTINE CALLED |
|||
|
|||
N/A N/A |
|||
|
|||
|
|||
REFERENCED FILES |
|||
|
|||
Inputs from and outputs to ARGS structure. |
|||
|
|||
|
|||
NON-STANDARD FEATURES |
|||
|
|||
NONE |
|||
|
|||
===============================================================================*/ |
|||
|
|||
/*=== INCLUDE FILES ====================*/ |
|||
|
|||
|
|||
|
|||
|
|||
/*=== CONSTANTS ========================*/ |
|||
|
|||
|
|||
|
|||
|
|||
/*=== MACROS ===========================*/ |
|||
|
|||
|
|||
|
|||
|
|||
/*=== LOCAL VARIABLES & TYPEDEFS =======*/ |
|||
|
|||
|
|||
|
|||
|
|||
/*=== FUNCTION PROTOTYPE DEFINITIONS ===*/ |
|||
|
|||
|
|||
|
|||
|
|||
|
|||
/*============================================================================== |
|||
|
|||
FUNCTION void cm_multi_input_pwl() |
|||
|
|||
AUTHORS |
|||
|
|||
20 Oct 2005 Phil Barker |
|||
|
|||
MODIFICATIONS |
|||
|
|||
20 Oct 2005 Phil Barker |
|||
|
|||
SUMMARY |
|||
|
|||
This function implements the multi-input gate pwl code model. |
|||
|
|||
INTERFACES |
|||
|
|||
FILE ROUTINE CALLED |
|||
|
|||
N/A N/A |
|||
|
|||
|
|||
RETURNED VALUE |
|||
|
|||
Returns inputs and outputs via ARGS structure. |
|||
|
|||
GLOBAL VARIABLES |
|||
|
|||
NONE |
|||
|
|||
NON-STANDARD FEATURES |
|||
|
|||
NONE |
|||
|
|||
==============================================================================*/ |
|||
|
|||
/*=== CM_MULTI_INPUT_PWL ROUTINE ===*/ |
|||
|
|||
#include <stdlib.h> |
|||
#include <stdio.h> |
|||
#include <string.h> |
|||
|
|||
static double |
|||
get_smallest_input( ARGS ) |
|||
{ |
|||
double smallest = INPUT(in[0]); |
|||
int size = PORT_SIZE(in); |
|||
int i; |
|||
|
|||
for ( i = 1; i < size; i++ ) |
|||
if ( INPUT(in[i]) < smallest ) smallest = INPUT(in[i]); |
|||
|
|||
return smallest; |
|||
} |
|||
|
|||
static double |
|||
get_largest_input( ARGS ) |
|||
{ |
|||
double largest = INPUT(in[0]); |
|||
int size = PORT_SIZE(in); |
|||
int i; |
|||
|
|||
for ( i = 1; i < size; i++ ) |
|||
if ( INPUT(in[i]) > largest ) largest = INPUT(in[i]); |
|||
|
|||
return largest; |
|||
} |
|||
|
|||
static double |
|||
get_slope( ARGS, int i ) |
|||
{ |
|||
return ( PARAM(y[i]) - PARAM(y[i-1]) )/( PARAM(x[i]) - PARAM(x[i-1]) ); |
|||
} |
|||
|
|||
static double |
|||
y_intercept( ARGS, int i, double slope ) |
|||
{ |
|||
return ( PARAM(y[i]) - slope*PARAM(x[i]) ); |
|||
} |
|||
|
|||
static double |
|||
get_output( ARGS, double x ) |
|||
{ |
|||
int size = PARAM_SIZE(x); |
|||
double result = 0; |
|||
double slope = 0; |
|||
int i; |
|||
|
|||
/* check if x beyond specified limits */ |
|||
if ( x <= PARAM(x[0]) ) return PARAM(y[0]); |
|||
if ( x >= PARAM(x[size-1]) ) return PARAM(y[size-1]); |
|||
|
|||
for ( i = 1; i < size; i++ ) |
|||
if ( x > PARAM(x[i-1]) && x <= PARAM(x[i]) ) |
|||
{ |
|||
slope = get_slope( private, i ); |
|||
result = slope*x + y_intercept( private, i, slope ); |
|||
break; |
|||
} |
|||
return result; |
|||
} |
|||
|
|||
void |
|||
cm_multi_input_pwl(ARGS) |
|||
{ |
|||
char* model = ( PARAM_NULL(model) == 1 ) ? "and" : PARAM(model); |
|||
double output; |
|||
|
|||
if ( ANALYSIS == TRANSIENT || ANALYSIS == DC ) |
|||
{ |
|||
if ( strcmp( model, "and" ) != 0 && strcmp( model, "or" ) != 0 && |
|||
strcmp( model, "nand" ) != 0 && strcmp( model, "nor" ) != 0 ) |
|||
{ |
|||
fprintf( stderr, "ERROR(cm_multi_input_pwl): unknown gate model type '%s'; expecting 'and|or|nand|nor'.\n", model ); |
|||
exit(-1); |
|||
} |
|||
if ( PARAM_SIZE(x) != PARAM_SIZE(y) ) |
|||
{ |
|||
fprintf( stderr, "ERROR(cm_multi_input_pwl): 'x' and 'y' input vectors are not the same size!\n" ); |
|||
exit(-1); |
|||
} |
|||
/* |
|||
Iterate through each input and find output value |
|||
and/nand: controlling input is chosen on the basis of the smallest value |
|||
or/nor: controlling input is chosen on the basis of the largest value |
|||
*/ |
|||
if ( strstr( model, "and" ) ) output = get_output( private, get_smallest_input( private ) ); |
|||
else output = get_output( private, get_largest_input( private ) ); |
|||
|
|||
OUTPUT(out) = output; |
|||
} |
|||
} |
|||
@ -0,0 +1,46 @@ |
|||
/*.......1.........2.........3.........4.........5.........6.........7.........8 |
|||
================================================================================ |
|||
Copyright 2005 |
|||
Intrinsity, Inc. Austin, TX 78738 |
|||
All Rights Reserved |
|||
|
|||
AUTHORS |
|||
|
|||
20 Oct 2005 Phil Barker |
|||
|
|||
SUMMARY |
|||
|
|||
This file contains the interface specification file for the |
|||
analog multi-input gate pwl code model. |
|||
|
|||
===============================================================================*/ |
|||
|
|||
NAME_TABLE: |
|||
|
|||
C_Function_Name: cm_multi_input_pwl |
|||
Spice_Model_Name: multi_input_pwl |
|||
Description: "multi_input_pwl block" |
|||
|
|||
|
|||
PORT_TABLE: |
|||
|
|||
Port_Name: in out |
|||
Description: "input array" "output" |
|||
Direction: in out |
|||
Default_Type: vd vd |
|||
Allowed_Types: [vd,id] [vd,id] |
|||
Vector: yes no |
|||
Vector_Bounds: [2 -] - |
|||
Null_Allowed: no no |
|||
|
|||
|
|||
PARAMETER_TABLE: |
|||
|
|||
Parameter_Name: x y model |
|||
Description: "x array" "y array" "model type" |
|||
Data_Type: real real string |
|||
Default_Value: 0.0 0.0 "and" |
|||
Limits: - - - |
|||
Vector: yes yes no |
|||
Vector_Bounds: [2 -] [2 -] - |
|||
Null_Allowed: no no yes |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue