⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bistlib.java

📁 Java遗传算法库
💻 JAVA
📖 第 1 页 / 共 2 页
字号:
/*i * BISTLib.java * * Created on 13 June 2003, 11:23 */package jaga.pj.circuits.control;import jaga.SampleData;import jaga.BitSet;import jaga.pj.circuits.SimulatorCircuit;import jaga.pj.circuits.SimulatorSimpleCircuit;import jaga.pj.circuits.CircuitsLib;import jaga.pj.circuits.fpgaft.FTLib;import jaga.pj.circuits.fpgaft.FPGALUTAbsoluteMapping;import jaga.pj.circuits.ConstantDelayModel;import java.util.Collection;import java.util.Vector;import java.util.ArrayList;import java.awt.Point;/** * * @author  mmg20 */public abstract class BISTLib implements java.io.Serializable {    public final static int E_MODE_HIGH = 0;    public final static int E_MODE_OSCILLATING = 1;    public final static int E_MODE_DUAL = 2;        public static final int E_BEHAVIOUR_HIGH = 1;    public static final int E_BEHAVIOUR_LOW_OK = 0;    public static final int E_BEHAVIOUR_LOW_ERROR = -1;            public final static String[] getEModeStrings = { "Error signal is Line High", "Error signal is non-Oscillating", "Error signal is Dual Rail" };            protected static int getEMode = E_MODE_HIGH;        public static void setGetEMode( int mode )    {        getEMode = mode;    }        /** Asume current circuit programmed already.  Returns collection with SSA0 and SSA1 at     * faults at all elements which are connected to outputs.     */    public static Collection buildAllFaultsColl( SimulatorCircuit circuit )    {        Vector rv = new Vector();        boolean[] used = jaga.pj.circuits.CircuitsLib.getUsed( circuit ); // even to E lines        for( int ul = 0; ul < used.length; ul++ )        {            if( used[ ul ] )            {                rv.add( new Point( ul, FTLib.SSAV0 ) );                rv.add( new Point( ul, FTLib.SSAV1 ) );            }        }        return  rv;    }        public static boolean faultPosE( Point currF, Collection faultCol )    {        Point currFC = ( Point ) currF.clone();        currFC.y = FTLib.SSAV0;        boolean rv = faultCol.contains( currFC );        currFC.y = FTLib.SSAV1;        rv = rv || faultCol.contains( currFC );        return rv;    }            public static Collection removeFaultAtPos( Point f, Collection col )    {        Point fr = new Point( f.x, FTLib.SSAV0 );        col.remove( fr );        fr.y = FTLib.SSAV1;        col.remove( fr );        return col;    }        public static boolean getE( BitSet[] output, int ix, int eSize, int nrEs, int iss, int startAt )    {        BitSet[] Es = new BitSet[ nrEs ];        for( int el = 0; el < nrEs; el++ )        {            Es[ el ] = output[ output.length - 1 - el ];        }        int start = ix * iss;        switch( getEMode )        {            case E_MODE_HIGH:            {                               int conc = 0;                for( int bl = start + startAt; bl < start + iss; bl++ )                {                    boolean someE = false;                    for( int el = 0; el < nrEs; el++ )                    {                        someE = someE || Es[ el ].get( bl );                    }                    if( someE )                    {                        conc++;                        if( conc >= eSize )                        {                            return true;                        }                    }else                    {                        conc = 0;                    }                }                return false;            }            case E_MODE_OSCILLATING:            {                int risingEdges = 0;                for( int bl = start + startAt + 1; bl < start + iss; bl++ )                {                    boolean someRisingEdge = false;                    for( int el = 0; el < nrEs; el++ )                    {                        someRisingEdge = someRisingEdge || ( Es[ el ].get( bl ) && !Es[ el ].get( bl - 1 ) );                    }                    if( someRisingEdge )                    {                        risingEdges++;                        //System.out.println("some rising edge at " + bl + " counting " + risingEdges ); //D                        if( risingEdges >= eSize )                        {                            return false;                        }                    }                }                return true;            }            case E_MODE_DUAL:            {                               int conc = 0;                for( int bl = start + startAt; bl < start + iss; bl++ )                {                    boolean someE = Es[ 0 ].get( bl ) == Es[ 1 ].get( bl );                    if( someE )                    {                        conc++;                        if( conc >= eSize )                        {                            return true;                        }                    }else                    {                        conc = 0;                    }                }                return false;            }        }        return false;    }    public static boolean getE( BitSet[] output, int eSize, int nrEs, int iss, int startAt )    {        return getE( 0, output, eSize, nrEs, iss, startAt );    }        /** Returns the value of E for this segment */    public static boolean getE( int ignoredSets, BitSet[] output, int eSize, int nrEs, int iss, int startAt )    {        BitSet[] Es = new BitSet[ nrEs ];        for( int el = 0; el < nrEs; el++ )        {            Es[ el ] = output[ output.length - 1 - el ];        }        int outLen = output[ 0 ].length();        switch( getEMode )        {            case E_MODE_HIGH:            {                //System.out.println("Checking if E High"); //D                int conc = 0;                for( int bl = ignoredSets * iss + startAt; bl < outLen; bl++ )                {                    boolean someE = false;                    for( int el = 0; el < nrEs; el++ )                    {                        someE = someE || Es[ el ].get( bl );                    }                    if( someE )                    {                        conc++;                        if( conc == eSize )                        {                            return true;                        }                    }else                    {                        conc = 0;                    }                }                return false;            }            case E_MODE_OSCILLATING:            case E_MODE_DUAL:            {                int nrInputSamples = outLen / iss;                for( int dl = ignoredSets; dl < nrInputSamples; dl++ )                {                    if( getE( output, dl, eSize, nrEs, iss, startAt ) )                    {                        return true;                    }                }                return false;            }            /*            case E_MODE_DUAL:            {                               int conc = 0;                for( int bl = ignoredSets * iss + startAt; bl < outLen; bl++ )                {                    boolean someE = Es[ 0 ].get( bl ) == Es[ 1 ].get( bl );                    if( someE )                    {                        conc++;                        if( conc >= eSize )                        {                            return true;                        }                    }else                    {                        conc = 0;                    }                }                return false;            }*/                    }        return false;    }            public static int getSingleOutAt( BitSet[] outs, int index, int nrEs, int iss )    {        int rv = jaga.ESLib.getLine( outs, iss * ( index + 1 ) - 1, 0, outs.length - 1 - nrEs );        return rv;    }        /** Returns the value as an integer of this sampeldata array at in this range     * checking that is stable    */    public static int getOutAt( BitSet[] outs, int index, int nrEs, int iss, double validChunkProp )    {        int end = ( index + 1 ) * iss;        int lastChunkLen = ( int )( iss * validChunkProp );        int lastOut = outs.length - 1 - nrEs;        int val0 = jaga.ESLib.getLine( outs, end - lastChunkLen, 0, lastOut );        int val1 = jaga.ESLib.getLine( outs, end - lastChunkLen / 2, 0, lastOut );        if( val0 == val1 )        {

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -