找回密码
 注册
关于网站域名变更的通知
查看: 1489|回复: 6
打印 上一主题 下一主题

[skill]-share skill

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2019-5-23 15:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
Hi all,
I want share with you some script.
/*
; FILE NAME: bbv_xsection.il
; VERSION: 2.0
;
;AUTHOR: eba
;DATE: March 10,2009
;
; COMMAND NAME: gen_xsection
; DESCRIPTION:
;   This allegro skill routine reads the current Allegro drawing extracting
;   all blind/buried vias, sorts the vias into various catagories, the creates
;   a graphical image of the via structure in a simple cross section diagram
;   that is added to the drawing in a group named "BBV-XSECTION".
;   
;   This command askes the user to pick an XY location for the placement of
;   the cross section diagram.
;
;   This Command also create two SUBCLASSES ( CROSS_SECTION and CROSS_SECTION_VIAS)
;   under the MANUFACTURING class. The basic cross section geometry is placed on
;   the MANUFACTURING/CROSS_SECTION layer, and Drill graphics are placed on the
;   MANUFACTURING/CROSS_SECTION_VIAS layer.
;
;   DISCLAIMER:
;   It is the resposibility of the user to maintain and alter this software. This
;   Software is not supported by cadence Design Systems. The User runs this software
;   at his or her own risk. Cadence Design Systems claims no responsibility for the
;   results of running this software.
;   You copy it, you use it, you own it.
;
; REVISIONS:
; 1.0   10-mar-09  eba  Initial Version
; 2.0   05-jan-10  eba  corrected outer dielectric layer issue and created a high
;                       sort to display via stack in more of an order. Removed the
;                        for a seed symbol, added x-seciton graphics and associated
;                        with a group named "BBV-XSECTION".
;
*/  


axlCmdRegister( "gen_xsection" '_XSECGEN_Start ?cmdType "general")
/*
------------------------------------------------------------------------
NAME: _XSECGEN_Start

SYNOPSIS:
        _XSECGEN_Start(
        )->

DESCRIPTION:
    This is the main function call for creating the cross section graphic data
    with display of various used via configurations.

ARGUMENTS:

RETURNS:
------------------------------------------------------------------------
*/  
defun( _XSECGEN_Start ()
let( ( units xsec_table used_bbvias subclass_def stack_count bbvia_list)
    when( axlOKToProceed() && upperCase( axlDBGetDesign()->objType) == "DESIGN"; make sure no other command is still running.
        units = car(axlDBGetDesignUnits()) ; get the current drawing units
        xsec_table = _XSECGEN_buildLayerData() ; get the board cross section data
        bbvia_list = _XSECGEN_getUsedBBVias() ;get bbvias
        if( bbvia_list then; make sure blind and buried vias exist.
            ;; build the master used via table list
             master_via_list = _XSECGEN_buildUsedLayerVias(
                                _XSECGEN_buildViaTable( bbvia_list xsec_table)
                           )
            ;; are the via graphics to be minumized
            when( _XSECGEN_getSetValues("MINIMAL_LAYOUT")
                master_via_list = _XSECGEN_getStackedBBVias(master_via_list)
            )

            stack_count = length( master_via_list) ;; get the number of conductor/plane layers
            xsect_grp = _XSECGEN_grpCreate()
            ; create the cross section graphics
            _XSECGEN_addXsectionGraphics(master_via_list stack_count xsec_table units xsect_grp )
        else
            sprintf( msg "Warning: No blind-buried vias found:/n")
            sprintf( msg "%sUnable to find blind-buried vias in design/n" msg)
            sprintf( msg "%sCommand will exit." msg)
        axlUIConfirm( msg )
        )

    )
    axlMsgPut( "Done")
))
/*
------------------------------------------------------------------------
NAME: _XSECGEN_getSetValues

SYNOPSIS:
        _XSECGEN_getSetValues(
                prop_name
        )-> value

DESCRIPTION:
    This function returns the assignd values to properties names passed
    to it.
    Current Properties are:
    "XSECTIONCLASSSUBCLASS" : the CLASS/SUBCLASS to add cross section
                                    graphics to
    "VIACLASSSUBCLASS"      : the CLASS/SUBCLASS to add via stacking
                                    graphics to
     "TEXTBLOCK"            : The text block size for conductor/plane
                                    layer labels in the cross section
    "MINIMAL_LAYOUT"        : t , reduces the via stack display to minimal
                              nil, maximizes via stack display

ARGUMENTS:
    prop_name   A string of property name.

RETURNS:
    value   The value for the given property
------------------------------------------------------------------------
*/  
defun( _XSECGEN_getSetValues ( prop_name )
prog( ()

    case( upperCase(prop_name)
            ("XSECTIONCLASSSUBCLASS"
                return( "MANUFACTURING/CROSS_SECTION" ) ; must conatain a legal CLASS and SUBCLASS NAME
            )
             ("VIACLASSSUBCLASS"
                return( "MANUFACTURING/CROSS_SECTION_VIAS" ) ; must conatain a legal CLASS and SUBCLASS NAME
            )
            ("TEXTBLOCK"
                return("4" ); Text block number in String format
            )
            ("MINIMAL_LAYOUT"
                return( t ); Use only "t" or "nil"
            )
    )
    return(nil)
))
/*
------------------------------------------------------------------------
NAME: _XSECGEN_getCrossHatch

SYNOPSIS:
        _XSECGEN_getCrossHatch(
                xhatch_type units
        )-> value

DESCRIPTION:
    This function returns a list of cross hatch definitions for
    a shape definition.
        "DBDIAG"
        "LDIAG"
        "RDIAG"
        "HORIZ"
        "VERT"
        "HORZVERT"
        "SOLID"
        "NONE"

ARGUMENTS:
    xhatch_type   A string for the requested cross hatch type

    units         The current drawing user units

RETURNS:
    xhatch   xhatch_list/t/nil values for the cross hatching of a shape
------------------------------------------------------------------------
*/  
defun( _XSECGEN_getCrossHatch ( xhatch_type units )
prog( ( xhatch_list spacing width)
         xhatch_list = list()

    case( xhatch_type
        ("DBDIAG"
            spacing =  axlMKSConvert( .010 "inches" units)
            width =  axlMKSConvert( .001 "inches" units)
            xhatch_list = list(
                make_axlFill( ?spacing spacing ?width width ?origin '(0.0 0.0) ?angle 45.0)
                make_axlFill( ?spacing spacing ?width width ?origin '(0.0 0.0) ?angle 135.0)
            )
        )
        ("LDIAG"
            spacing =  axlMKSConvert( .150 "inches" units)
            width =  axlMKSConvert( .001 "inches" units)
            xhatch_list = list(
                make_axlFill( ?spacing spacing ?width width ?origin '(0.0 0.0) ?angle 135.0)
            )
        )
        ("RDIAG"
            spacing =  axlMKSConvert( .150 "inches" units)
            width =  axlMKSConvert( .001 "inches" units)
            xhatch_list = list(
                make_axlFill( ?spacing spacing ?width width ?origin '(0.0 0.0) ?angle 45.0)
            )
        )
        ("HORIZ"
            spacing =  axlMKSConvert( .050 "inches" units)
            width =  axlMKSConvert( .001 "inches" units)
            xhatch_list = list(
                make_axlFill( ?spacing spacing ?width width ?origin '(0.0 0.0) ?angle 90.0)
            )
        )
        ("VERT"
            spacing =  axlMKSConvert( .050 "inches" units)
            width =  axlMKSConvert( .001 "inches" units)
            xhatch_list = list(
                make_axlFill( ?spacing spacing ?width width ?origin '(0.0 0.0) ?angle 0.0)
            )
        )
        ("HORZVERT"
            spacing =  axlMKSConvert( .050 "inches" units)
            width =  axlMKSConvert( .001 "inches" units)
            xhatch = list(
                make_axlFill( ?spacing spacing ?width width ?origin '(0.0 0.0) ?angle 0.0)
                make_axlFill( ?spacing spacing ?width width ?origin '(0.0 0.0) ?angle 90.0)
            )
        )
        ("SOLID"
            xhatch_list = t
        )
        ("NONE"
            xhatch_list = nil
        )
        ( t
            xhatch_list = nil
        )
    )

    return( xhatch_list )
))
/*
------------------------------------------------------------------------
NAME: _XSECGEN_getDielectricHeight

SYNOPSIS:
        _XSECGEN_getDielectricHeight(
                units
        )-> value

DESCRIPTION:
    This function is where the dielectirc layer cross section
    height/thickness value is defined. The thickness value
    is set here in inches. The function is passed the current
    drawing and the value returned is in current drawing units.

ARGUMENTS:
    units   The current drawing user units.

RETURNS:
    value   Floating value in current user units.
------------------------------------------------------------------------
*/

defun( _XSECGEN_getDielectricHeight (units)
prog( ()
     return( axlMKSConvert( .150 "inches" units))
))
/*
------------------------------------------------------------------------
NAME: _XSECGEN_getPlaneHeight

SYNOPSIS:
        _XSECGEN_getPlaneHeight(
                units
        )-> value

DESCRIPTION:
    This function is where the default plane layer cross section
    layer height/thickness value is defined. The thickness value
    is set here in inches. The function is passed the current
    drawing and the value returned is in current drawing units.

ARGUMENTS:
    units   The current drawing user units.

RETURNS:
    value   Floating value in current user units.
------------------------------------------------------------------------
*/

defun( _XSECGEN_getPlaneHeight (units)
prog( ()
     return(  _XSECGEN_getConductorHeight(units)); keep same as conductor layer
))
/*
------------------------------------------------------------------------
NAME: _XSECGEN_getConductorHeight

SYNOPSIS:
        _XSECGEN_getConductorHeight(
                units
        )-> value

DESCRIPTION:
    This function is where the default conductorlayer cross section
    height/thickness value is defined. The thickness value
    is set here in inches. The function is passed the current
    drawing and the value returned is in current drawing units.

ARGUMENTS:
    units   The current drawing user units.

RETURNS:
    value   Floating value in current user units.
------------------------------------------------------------------------
*/  
defun( _XSECGEN_getConductorHeight (units)
prog( ()
    return( axlMKSConvert( .075 "inches" units))
))

/*
------------------------------------------------------------------------
NAME: _XSECGEN_buildLayerData

SYNOPSIS:
        _XSECGEN_buildLayerData(
        )->layer_data_list

DESCRIPTION:
    This function reads the current cross section data of the design and
    generates a list of layer definitions.
    The layer definitions are defined as
        layer_code      "C"= conductor, "" Plane , "D" = dielectric, "M" = mask
        subclass name   The subclass name of the layer under the ETCH class. Dielectrics
                        are not contains within the ETCH class.
        material name   The Material name derived from the cross section definition
        thickness       The material thickness derived from the cross section definition
        layer number    Numbered in sequence read from cross section definition
                        1-300: conductor or plane layer
                        301 - 500: Dielectric layer number
                        501 - ~: Mask layer number

ARGUMENTS:

RETURNS:
    layer_data_list     A list of layer data lists

            list(
                    list(
                        "<Layer Code>"
                        "<subclass name>"
                        "<material name>"
                        <thickness>
                        <layer number>
                    )
                    .
                    .
                    .
            )
EXAMPLE OUTPUT:
   (
        ( (
        ("C" "TOP" "0.5_OZ_CU+.025MM_PL" "1.614173 mil" 1)
        ("D" "-" "G10" "3.307087 mil" 301)
        ("C" "LAYER_2" "0.5_OZ_CU+.025MM_PL" "1.614173 mil" 2)
        ("D" "-" "G10" "3.307087 mil" 302)
        ("C" "LAYER_3" "0.5_OZ_CU+.025MM_PL" "1.614173 mil" 3)
        ("D" "-" "G10" "3.307087 mil" 303)
        ("C" "BOTTOM" "0.5_OZ_CU+.025MM_PL" "1.614173 mil" 4)
    )
------------------------------------------------------------------------
*/  
defun(  _XSECGEN_buildLayerData ()
prog( ( de msk layer_data_list lyr_data ltype lname lMaterial lThickness layer_number)
    ;;Set the starting layer interger numbers to identify the layer type.
    de = 301; Dielectric layers
    msk = 501; Mask Layers

    layer_data_list = list()
    foreach( lyr axlGetXSection(); extract the xsection and read each layer
        unless( nth(2 lyr) == "AIR" ; Ignore the AIR layer
           case( nth(1 lyr)
                ; Dielectric data
                ("DIELECTRIC"
                    ltype = "D"
                    lname = "-"
                    lMaterial = nth(2 lyr)
                    lThickness = nth(3 lyr)
                    layer_number = de++
                )
                lane layer ( a conductor layer)
                ("LANE"
                    ltype = "P"
                    lname = nth(0 lyr)
                    lMaterial = nth(2 lyr)
                    lThickness = nth(3 lyr)
                    layer_number= axlLayerGet(strcat("ETCH/" nth(0 lyr)))->number + 1
                )
                ;Conductor layer
                ("CONDUCTOR"
                    ltype = "C"
                    lname = nth(0 lyr)
                    lMaterial = nth(2 lyr)
                    lThickness = nth(3 lyr)
                    layer_number = axlLayerGet(strcat("ETCH/" nth(0 lyr)))->number + 1
                )
                ; undesignated layer or mask layer if defined.
                ( t
                                ltype = "M"
                    lname = "mask"
                    lMaterial = nth(2 lyr)
                    lThickness = nth(3 lyr)
                    layer_number =  msk++
                )
            );case

            ;build layer data list
            lyr_data = list( ltype lname lMaterial lThickness layer_number)
            layer_data_list = append1(layer_data_list lyr_data)
        )
    )
    return( layer_data_list)
       
))

/*
------------------------------------------------------------------------
NAME: _XSECGEN_getUsedBBVias

SYNOPSIS:
        _XSECGEN_getUsedBBVias(
        )->layer_data_list

DESCRIPTION:
    This function sets visibility of all vias layers then selects
    all the vias in the drawing. Each via is the examined to verify
    it is not a Through via, but a bbvia. These bbvia dbids are then
    added to the list tht is returned. the graphics are then returned
    to the previous state.

ARGUMENTS:

RETURNS:
    l_bbvs     A list of blind/burried via dbids
------------------------------------------------------------------------
*/  
defun( _XSECGEN_getUsedBBVias ()
prog( (l_bbvs)
        _XSECGEN_fndFltrVias(); set find filter
        visible_layers = axlVisibleGet() ; get current graphics data
        axlVisibleDesign(t); set entire graphics visible

        l_bbvs = list(); intialize used via list
        design_vias = axlGetSelSet( axlAddSelectAll()); select all via in design
        axlVisibleSet( visible_layers ) ; return to origin graphics visibility

        ;; find and save the dbids of all bbvias
        foreach( bbv design_vias
                unless( car(bbv->startEnd) == cadr(bbv->startEnd)
                        l_bbvs = cons( bbv l_bbvs)
                )
        )
        ; clear the select table
        axlClearSelSet()

       ; return the list
        return( l_bbvs)  
))

/*
------------------------------------------------------------------------
NAME: _XSECGEN_fndFltrVias

SYNOPSIS:
        _XSECGEN_fndFltrVias(
        )->layer_data_list

DESCRIPTION:
    This function sets find filter for vias only
ARGUMENTS:

RETURNS:
    success     t/nil
------------------------------------------------------------------------
*/                 
defun( _XSECGEN_fndFltrVias ()
prog( (success)

    success = axlSetFindFilter(
        ?enabled '("NOALL" "VIAS")
        ?onButtons '("VIAS")
    )
    return( success)
))

/*
------------------------------------------------------------------------
NAME: _XSECGEN_buildViaTable

SYNOPSIS:
        _XSECGEN_buildViaTable(
                l_bbvias
                xsec_table
        )->l_via_table

DESCRIPTION:
    This function reads the used bbvia list and sorts the vias by xy
    coordinates. The vias defined at each xy coordinate is saved as a
    sub list of start/end layer numbers. The list is thern returned.
    A progress meter is displayed displaying the number of vias
    processed.

ARGUMENTS:
   l_bbvia      A list of blind buried via dbids

    xsec_table  The List of cross section data create by the
                    _XSECGEN_buildLayerData function call.
RETURNS:
    l_via_table     A list of xy coodrinates with one or more pairs of
                    start/end layer numbers representing the start/end
                    layer definition of a via.

    list(
         list( (X Y)
            list(
                list( start_layer_number  end_layer_number )
            )
        )
        .
        .
        .
    )

EXAMPLE OUTPUT:     
    (
        (
            (1.975 42.425)
            (
                (1 2)
            )
        )
        (
            (5.275 42.175)
            (
                (1 2)
                (2 3)
            )
        )
        (
            (4.275 40.75)
            (
                (1 2)
                (2 3)
                (3 6)
                (6 7)
            )
        )
    )
------------------------------------------------------------------------
*/          
defun( _XSECGEN_buildViaTable ( l_bbvias xsec_table)
prog( (l_via_table l_via_xy max_count via_number via_array i x found last_used v_data lxy start_layer
        end_layer z)
        l_via_table = list() ; initalize the return list
        l_via_xy = list() ; initalize the via xy coordinate list
        max_count = length(l_bbvias); get the total number of vias
        via_number = 0 ; set the via counter
        ;; start the progress meter
        axlMeterCreate("Building via table." "" nil)

        ;initalize the via table
        declare( via_array[max_count])

        i = 0 ;intialize the index

       ;; walk through the bb via list
        foreach( bvia l_bbvias
                via_number++ ; increment the via count
                ; updated the progress meter.
                axlMeterUpdate( (100 * via_number)/max_count sprintf( nil "Read %d of %d vias." via_number max_count))
                lxy = bvia->xy; get via instance XY
                if( i > 0 then ; is this the first one?
                    x=0
                    found = nil
                    ;;Walk throught the current array looking for matching xy coodrdinates
                    while( x < max_count
                            if( via_array[x] == 'unbound then
                                last_used = x
                                   x = max_count + 1
                        else
                                v_data = via_array[x]
                                when( car(v_data) == lxy
                                        ;;xy coordinate found, add a new entry into the via layer pair list
                                        l_via_xy = car( v_data)
                                        start_layer = _XSECGEN_getLayerNumber( car( bvia->startEnd) xsec_table )
                                        end_layer = _XSECGEN_getLayerNumber( cadr( bvia->startEnd) xsec_table)
                                        via_array[x] = list( l_via_xy cons( sort(list(start_layer end_layer) 'lessp) cadr( v_data ) ))
                                        found = t
                                        x = max_count
                                )       
                        )
                        x++
                   )
                    ;; xy coordinate not found, add a new entry into the table
                   unless( found
                        start_layer = _XSECGEN_getLayerNumber( car( bvia->startEnd) xsec_table )
                        end_layer = _XSECGEN_getLayerNumber( cadr( bvia->startEnd) xsec_table)
                        via_array[i] = list( bvia->xy  list( sort(list( start_layer end_layer) 'lessp)) )
                        i++
                  )               
                  
                else
                    ;create a table entry for the first via.
                    start_layer = _XSECGEN_getLayerNumber( car( bvia->startEnd) xsec_table )
                    end_layer = _XSECGEN_getLayerNumber( cadr( bvia->startEnd) xsec_table)
                    via_array[i] = list( bvia->xy  list( sort(list( start_layer end_layer) 'lessp)) )
                    i++
                )
        )

        ;;close progress meter
        axlMeterDestroy()

        ;; convert array into a readable list.
        z = 0
        while( z < max_count
             unless(  via_array[z] == 'unbound
                     l_via_table = cons( via_array[z] l_via_table)
             )
             z++
        )       
        ;; return the list                               
        return( l_via_table)
))


/*
------------------------------------------------------------------------
NAME: _XSECGEN_buildUsedLayerVias

SYNOPSIS:
        _XSECGEN_buildUsedLayerVias(
                 used_bbvias
        )-> via_table

DESCRIPTION:
    This function reads the used bbvia listreduces the list by via layering
    and stacking resulting in one list entry for each layer pair and stack.
    A progress meter is displayed displaying the number of vias entries
    processed.

ARGUMENTS:
    used_bbvias      A list of blind buried via dbids creatde by the
                    _XSECGEN_buildViaTable function call.
RETURNS:
    via_table       A list lists containg via start/end layer numbers.
    list(
            list(
                list( start_layer_number  end_layer_number )
            )
            list(
                list( start_layer_number  end_layer_number )
                list( start_layer_number  end_layer_number )
            )
        )
        .
        .
        .
    )

EXAMPLE OUTPUT:     
    (
        (
            (1 2)
        )
        (
            (1 2)
            (2 3)
        )
        (
            (2 3)
            (3 6)
            (6 7)
        )
    )
------------------------------------------------------------------------
*/          
defun( _XSECGEN_buildUsedLayerVias ( used_bbvias )
prog( (max_count via_table layer_set via_count max_index index match_found match_count)

    ;; intialize lists
    via_table = list()
    layer_set = list()

    ;; start the progress meter
    axlMeterCreate( "Sorting via layer sets" " " nil)

    ;;initalize via count
    via_count = 0
    max_count = length( used_bbvias)
        foreach( item used_bbvias
            via_count++;; increment via count
            ;; update meter
            axlMeterUpdate( (100 * via_count)/max_count sprintf( nil "Read %d of %d vias." via_count max_count))

            if( via_table == nil then
                ;; add inital via entry.
                layer_set = cadr( item )
                via_table = cons( layer_set via_table)
            else
                layer_set = cadr( item )
                max_index = length(via_table)
                index = 0
                match_found = nil
                while(index < max_index
                    lyr_def= nth(index  via_table)
                    when( length( lyr_def ) == length( layer_set)
                        match_count = 0
                        foreach( lyr layer_set
                                when( member( lyr lyr_def) match_count++)
                        )
                        when( match_count == length(lyr_def )
                            index = max_index
                            match_found = t
                        )
                    )
                    index++
                )
                unless( match_found
                    layer_set = cadr( item )
                    via_table = cons( layer_set via_table)
                )
                               
            )
       
        )
        ;; close the meter
        axlMeterDestroy()                                       
       
        ;; return the master list               
        return( via_table )
))
/*
------------------------------------------------------------------------
NAME: _XSECGEN_getLayerNumber

SYNOPSIS:
        _XSECGEN_getLayerNumber(
            lyrClassSubclass  
            xsec_table
        )->layer_number

DESCRIPTION:
    This function returns the layer number integer of the ECTH subclass name
    defined in the cross section table created by the _XSECGEN_buildLayerData
    function

ARGUMENTS:
   lyrClassSubclass The layer name in the form of "CLASS/SUBCLASS"
   xsec_table       The List of cross section data create by the
                       _XSECGEN_buildLayerData function call.
RETURNS:
    layer_number    Integervalue of the layer number. -1 returned if layer
                   name not found
------------------------------------------------------------------------
*/         
defun( _XSECGEN_getLayerNumber ( lyrClassSubclass  xsec_table)
prog( (subclass)
        subclass = cadr(parseString( lyrClassSubclass "/"))
        foreach( item xsec_table
                when( nth(1 item) == subclass return( nth(4 item)))
        )
        return(-1)
))

/*
------------------------------------------------------------------------
NAME: _XSECGEN_getStackedBBVias

SYNOPSIS:
        _XSECGEN_getStackedBBVias(
            stack_list  
        )->master_via_list

DESCRIPTION:
    This function taks in a list of stacked via lists and begins the sort process
    to define specific stacked via types, or individual via types.

ARGUMENTS:
   stack_list   A list of via stacks created by the _XSECGEN_buildUsedLayerVias
                function.
RETURNS:
    master_via_list    A list containing lists of via start/end layer numbers as
                       individual or stacked vias.
------------------------------------------------------------------------
*/
defun( _XSECGEN_getStackedBBVias ( stack_list )
prog( (  master_via_list  list_via_set )
    master_via_list = list()
    list_via_set = list()
   ; unstacked_via_list = list()
   ; last_via = list()
    foreach( item stack_list
        list_via_set = _XSECGEN_build_stackedEntry( item )
        foreach( vs list_via_set
                unless( member( vs master_via_list)
                    master_via_list = append1( master_via_list vs)
                )
            )
    )

return( master_via_list )
))

/*
------------------------------------------------------------------------
NAME: _XSECGEN_build_stackedEntry

SYNOPSIS:
        _XSECGEN_build_stackedEntry(
            via_stack_set
        )->layer_number

DESCRIPTION:
    This functiontakes in a list of via start/end lists, determins if via sets
    are sequencial. New lists are created to separate sequencial via stacks from
    non-sequencial via stacks and returns the list data
    function

ARGUMENTS:
   via_stack_set    A list of paired lists. Each paired list represents the start/end
                    layer number for a via.

RETURNS:
    via_set_list    A list of new via stacks

EXAMPLE:
    INPUT:
        list(
            list( 1 2)
            list( 2 3)
            list( 3 4)
            list( 5 6)
            list( 7 8)
            list( 8 9)
        )
    OUTPUT:
        list(
            list(
                list( 1 2)
                list( 2 3)
                list( 3 4)
            )
            list(
                list( 5 6)
            )
            list(
                list( 7 8)
                list( 8 9)
            )
        )
------------------------------------------------------------------------              
*/       
defun( _XSECGEN_build_stackedEntry ( via_stack_set )
prog( ( via_set via_set_list via_count via_stack v x)
    via_set = list()
    via_set_list = list()
    via_count = length( via_stack_set)
    via_stack_set = sortcar( via_stack_set 'lessp)
    v = 0
    while( v < via_count
        via_set = append1( via_set nth(v via_stack_set))
        x = v + 1
        while( x < via_count
            if( car( nth( x via_stack_set)) == cadr( nth( (x - 1) via_stack_set)) then
                via_set = append1( via_set nth(x via_stack_set))
                x++
                v++
            else
                ;;via_set_list= append1( via_set_list via_set )
               ;;
                x = via_count
            )
        )
        via_set_list= append1( via_set_list via_set )
        via_set = list()
        v++
    )
return( via_set_list )
))

/*
------------------------------------------------------------------------
NAME: _XSECGEN_addXsectionGraphics

SYNOPSIS:
        _XSECGEN_addXsectionGraphics(
            master_via_list
            stack_count
            xsection_table
            units
            xsect_group
        )->

DESCRIPTION:
    This is the main function call for creating the cross section graphic data

ARGUMENTS:
    master_via_last     List of used via types and stacks created by the
                            _XSECGEN_getStackedBBViasfunction
    num_cond_layers     Integer of the number of actual exlectrical layers
                            (conductor and plane)
    xsection_table      List of Cross section data created by the
                             _XSECGEN_buildLayerData function
    units               The current drawing units type
    xsect_grp                The groupd dbid for cross section generation.

RETURNS:
------------------------------------------------------------------------
*/  
defun( _XSECGEN_addXsectionGraphics (master_via_list stack_count xsection_table units xsect_grp)
let( (start_xy  XSectionClassSubclass ViaClassSubclass txt_blk xsec_length xsec_length msg
        grp_id)

    ;; get the placement origin for the cross section graphics
    start_xy = axlEnterPoint(?prompts "Pick Cross Section Detail Location" ?gridSnap t)

    ;; get subclass names
    XSectionClassSubclass = _XSECGEN_getSetValues("XSectionClassSubclass")
    ViaClassSubclass = _XSECGEN_getSetValues("ViaClassSubclass")

    ;;create the subclass(es)  as needed   
    _XSECGEN_createXsectionSubclass( XSectionClassSubclass )
    _XSECGEN_createXsectionSubclass(ViaClassSubclass )

    ;; get the placement location and add the base symbol geometry
    ;; sym_dbid = _XSECGEN_addSymbolBasic( start_xy )

    ;; define the text block, and calculate width of xsection drawing and get max number of conductor layers.
    txt_blk = _XSECGEN_getSetValues("TextBlock")
    xsec_length = (stack_count * axlMKSConvert( .200 "inches" units)) + axlMKSConvert( .300 "inches" units)
    max_cond_layers = _XSECGEN_getConductorLayerCount( xsection_table )
    when( xsec_length < axlMKSConvert( 1.500 "inches" units) xsec_length = axlMKSConvert( 1.500 "inches" units))

    ;; build and draw the cross section and vias.
    _XSECGEN_buildStackup( xsection_table start_xy xsec_length units txt_blk XSectionClassSubclass xsect_grp)
    _XSECGEN_buildViaStructure( master_via_list start_xy units txt_blk ViaClassSubclass max_cond_layers xsect_grp)
    axlMsgPut( "bbv Cross section diagram created")

))

/*
------------------------------------------------------------------------
NAME: _XSECGEN_buildStackup

SYNOPSIS:
        _XSECGEN_buildStackup(
            xsection_table
            start_xy
            xsec_length
            units
            txt_blk
            classSubclass
            xsect_grp
        )->
DESCRIPTION:
    Walks through the cross section table, verifies the layer type,
    then calls the function to draw the layer into the cross-section
    symbol

ARGUMENTS:
    xsection_table  List of Cross section data
    start_xy    The XY coordinate from the inital user pick
    xsec_length The calculated length of the cross section drawing
    units       The current drawing units type
    txt_blk     The Text block used for adding text  
    classSubclass   The String of the drawing layer for the cross section
                drawing in the form of "CLASS/SUBCLASS"

RETURNS:
    none
------------------------------------------------------------------------
*/  
defun( _XSECGEN_buildStackup ( xsection_table start_xy xsec_length units txt_blk classSubclass xsect_grp)
prog( (sx sy grp_id lyr_data)
    ;; get the X and Y coordinate of the user picked origin

    sx = car(start_xy)
    sy = cadr(start_xy)

    ;;Set the number of layers counter
    item_count = 0

    ;; walk through each layer and draw the subclass
    foreach( lyr xsection_table
        case( car(lyr)
            ( "C"   ; conductor layer
                lyr_data = _XSECGEN_Draw_conductorLayer(sx sy units xsec_length txt_blk nth( 4 lyr) classSubclass xsect_grp)
                sy = cadr(lyr_data)
            )
            ( "P" ;plane layer
                lyr_data = _XSECGEN_Draw_planeLayer(sx sy units xsec_length txt_blk nth( 4 lyr) classSubclass xsect_grp)
                sy = cadr(lyr_data)
            )
            ( "D" ;Dielectric layer
                lyr_data = _XSECGEN_Draw_dielectricLayer(sx sy units xsec_length txt_blk nth( 4 lyr) classSubclass xsect_grp )
                sy = cadr(lyr_data)
            )
            ( t
                axlMsgPut("Undefined Layer Type: %s" car(lyr))
            )
        )
        item_count++
    )
    return( t )
))

/*
------------------------------------------------------------------------
NAME: _XSECGEN_buildViaStructure

SYNOPSIS:
        _XSECGEN_buildViaStructure(
            master_via_list
            start_xy
            units
            txt_blk
            classSubclass
            num_cond_layers
            xsect_grp
        )->

DESCRIPTION:
    This function Walks through the mater via list, determining if a via id defined
    between two layers, or more that two layers, then launches the graphic creation
    tools to create a graphical via stackup of used vias on the cross-section
    symbol.

ARGUMENTS:
    master_via_last List of used via types and stacks created by the
                     _XSECGEN_getStackedBBViasfunction
    start_xy    The XY coordinate from the inital user pick
    units       The current drawing units type
    txt_blk     The Text block used for adding text
    classSubclass   The String of the drawing layer for the cross section
                drawing in the form of "CLASS/SUBCLASS"
    num_cond_layers Integer of the number of actual exlectrical layers ( conductor and plane)
    xsect_grp

RETURNS:
    (none)
------------------------------------------------------------------------
*/  
defun( _XSECGEN_buildViaStructure (master_via_list start_xy units txt_blk classSubclass num_cond_layers xsect_grp)
let( ()
    ;get the starting  xy y coordinates after the layer title text offset.
    sx = car(start_xy) + _XSECGEN_getTextXOffset(txt_blk units) + axlMKSConvert( .125 "inches" units)
    sy = cadr(start_xy)
    ;; define the gap space between each drill graphic
    vgap = axlMKSConvert( .05 "inches" units)
    ;;Walk through the via list
    lyr_count = 1
    while( lyr_count < num_cond_layers
            foreach( via_set  master_via_list
                if( length( via_set ) == 1 then
                    ; single node via so draw this via
                    when( car( car( via_set)) == lyr_count
                        new_xy = _XSECGEN_DrawSingleVia( via_set
                                                    ( sx + vgap )  sy
                                                    units classSubclass
                                                    num_cond_layers xsect_grp
                                                    )
                        sx = car( new_xy )
                    )
            else
                ;; stack vias
                when( car( car( via_set)) == lyr_count
                    foreach( via via_set
                        ;draw each via
                        new_xy = _XSECGEN_DrawSingleVia( list( via ) ( sx + vgap )
                                                         sy units classSubclass
                                                         num_cond_layers xsect_grp
                                                        )
                    )
                    sx = car( new_xy )
                )
            )
        )
        lyr_count++
    )
))

/*
------------------------------------------------------------------------
NAME: _XSECGEN_Draw_conductorLayer

SYNOPSIS:
       _XSECGEN_Draw_conductorLayer(
                    sx
                    sy
                    units
                    xsec_length
                    txt_blk
                    lyr_number
                    classSubclass
                    xsect_grp
                )-> l_xy

DESCRIPTION:
    This function creates the conductor layer graphic for the cross section
    ad attaches this graphic element (shape) to the input symbol dbid.

ARGUMENTS:
    sx              The starting graphic x coordinate
    sy              The starting graphic y coordinate
    units           The current drawing units type
    xsec_length     The calculated length of the cross section drawing

    txt_blk         The Text block used for adding text
    lyr_number      An integer definiting the conductor layer number.  
    classSubclass   The String of the drawing layer for the cross section
                drawing in the form of "CLASS/SUBCLASS"
    xsect_grp            DBID of the X-section Group

RETURNS:
    l_xy            A List of the geometry's lower left xy coordinates
------------------------------------------------------------------------
*/  
defun( _XSECGEN_Draw_conductorLayer (sx sy units xsec_length txt_blk lyr_number classSubclass xsect_grp)
prog( (left right top bottom  path_array shape_id)
        ;;Add the layer text label to the drawing and get t's XY position
        EndXY = _XSECGEN_addLayerTitle( sx sy classSubclass txt_blk lyr_number units xsect_grp)


        left = car( EndXY ) + axlMKSConvert( .025 "inches" units) ; derive the left x coordinate
        right = left + xsec_length ; derive the right x coordinate
        top = sy ; derive the top y coordinate
        bottom = sy - _XSECGEN_getConductorHeight(units) ; derive the bottom y coordinate

        ;; build the graphic figure and add to the drawing.
        path_array = axlPathStart( list( left : top) 0.0)
                axlPathLine( path_array 0.0 list( right  top) )
                axlPathLine( path_array 0.0 list( right bottom) )
                axlPathLine( path_array 0.0 list( left  bottom) )
                axlPathLine( path_array 0.0 list( left top ))

        ;; add the shape to the drawing
        axlDBAddGroupObjects( xsect_grp
                axlDBCreateShape(
                            path_array
                            _XSECGEN_getCrossHatch( "NONE" units ) ;; get cross-hatching
                            classSubclass nil nil
                )
        )
        ;;axlDBCreateCloseShape( shape_id)

    ;; return the lower left xy coordinate
    return( list(left bottom))
))
/*
------------------------------------------------------------------------
NAME: _XSECGEN_Draw_planeLayer

SYNOPSIS:
       _XSECGEN_Draw_planeLayer(
                    sx
                    sy
                    units
                    xsec_length
                    txt_blk
                    lyr_number
                    classSubclass
                    xsect_grp
                )-> l_xy

DESCRIPTION:
    This function creates the plane layer graphic for the cross section
    ad attaches this graphic element (shape) to the input symbol dbid.

ARGUMENTS:
    sx              The starting graphic x coordinate
    sy              The starting graphic y coordinate
    units           The current drawing units type
    xsec_length     The calculated length of the cross section drawing
    txt_blk         The Text block used for adding text
    lyr_number      An integer definiting the conductor layer number.  
    classSubclass   The String of the drawing layer for the cross section
                drawing in the form of "CLASS/SUBCLASS"
    xsect_grp            DBID of the X-section Group

RETURNS:
    l_xy            A List of the geometry's lower left xy coordinates
------------------------------------------------------------------------
*/  
defun( _XSECGEN_Draw_planeLayer (sx sy units xsec_length txt_blk lyr_number classSubclass xsect_grp)
prog( (left right top bottom path_array shape_id)

        ;;Add the layer text label to the drawing and get t's XY position
        EndXY = _XSECGEN_addLayerTitle( sx sy classSubclass txt_blk lyr_number units xsect_grp )

        left = car( EndXY ) + axlMKSConvert( .025 "inches" units); set the left side x coordinate
        right = left + xsec_length ; set the right side x coordinate
        top = sy ; set the top y coordinate
        bottom = sy - _XSECGEN_getPlaneHeight(units); set the bottom y coordinate

         ;; build the graphic figure and add to the drawing.
        path_array = axlPathStart( list( left : top) 0.0)
                axlPathLine( path_array 0.0 list( right  top) )
                axlPathLine( path_array 0.0 list( right bottom) )
                axlPathLine( path_array 0.0 list( left  bottom) )
                axlPathLine( path_array 0.0 list( left top ))

        ;; add the shape to the drawing
        axlDBAddGroupObjects( xsect_grp
                axlDBCreateShape(
                    path_array
                    _XSECGEN_getCrossHatch( "DBDIAG" units ) ;; get cross-hatching
                    classSubclass nil nil
                )
        )
        ;;axlDBCreateCloseShape( shape_id)

    ;; return the lower left xy coordinate
    return( list(left bottom ))
))

/*
------------------------------------------------------------------------
NAME: _XSECGEN_Draw_dielectricLayer

SYNOPSIS:
       _XSECGEN_Draw_dielectricLayer(
                    sx
                    sy
                    units
                    xsec_length
                    txt_blk
                    lyr_number
                    classSubclass
                    xsect_grp
                )-> l_xy

DESCRIPTION:
    This function creates the dielectric layer graphic for the cross section
    ad attaches this graphic element (shape) to the input symbol dbid.

ARGUMENTS:
    sx              The starting graphic x coordinate
    sy              The starting graphic y coordinate
    units           The current drawing units type
    xsec_length     The calculated length of the cross section drawing
    txt_blk         The Text block used for adding text
    lyr_number      An integer definiting the conductor layer number.  
    classSubclass   The String of the drawing layer for the cross section
                drawing in the form of "CLASS/SUBCLASS"
    xsect_grp            DBID of the X-section group

RETURNS:
    l_xy            A List of the geometry's lower left xy coordinates
------------------------------------------------------------------------
*/  
defun( _XSECGEN_Draw_dielectricLayer (sx sy units xsec_length txt_blk lyr_number classSubclass xsect_grp)
prog( (left right top bottom path_array xhatch shape_id)

        ;; get the text offset to find the actual graphic starting point
        left = sx + _XSECGEN_getTextXOffset(txt_blk units) + axlMKSConvert( .025 "inches" units); set the left side x coordinate
        right = left + xsec_length; set the right side x coordinate
        top = sy; set the top y coordinate
        bottom = sy - _XSECGEN_getDielectricHeight(units) ; set the bottom y coordinate

        ;; build the graphic figure and add to the drawing.
        path_array = axlPathStart( list( left : top) 0.0)
                axlPathLine( path_array 0.0 list( right  top) )
                axlPathLine( path_array 0.0 list( right bottom) )
                axlPathLine( path_array 0.0 list( left  bottom) )
                axlPathLine( path_array 0.0 list( left top ))

        ;; determine the layer number to alternate the cross-hatching
        if( mod(lyr_number 2) > 0 then
            xhatch = _XSECGEN_getCrossHatch( "LDIAG" units ) ;; get cross-hatching
        else
            xhatch = _XSECGEN_getCrossHatch( "RDIAG" units ) ;; get cross-hatching
        )

        ;; add the shape to the drawing
        axlDBAddGroupObjects( xsect_grp
            axlDBCreateShape( path_array xhatch classSubclass nil nil)
        )
        ;;axlDBCreateCloseShape( shape_id )

    ;; return the lower left xy coordinate
    return( list(sx bottom))
))

/*
------------------------------------------------------------------------
NAME: _XSECGEN_getTextXOffset

SYNOPSIS:
       _XSECGEN_getTextXOffset(

                    txt_blk
                    units
                )-> offset

DESCRIPTION:
    This function gets the character width and spacing for the text block entered
    and returns the combined value .

ARGUMENTS:
    txt_blk         A String of the Text blocknumber
    units           The current drawing units type

RETURNS:
    offset          The combined character width and spacing values.
------------------------------------------------------------------------
*/  
defun( _XSECGEN_getTextXOffset (txt_blk units)
prog( (offset blkId txtPARM)
    txtParm = sprintf( txtParm "paramTextBlock:%s" txt_blk)
    blkId= axlGetParam( txtParm )
    offset = (blkId->width + blkId->charSpace) * 8
    return( offset )
))
/*
------------------------------------------------------------------------
NAME: _XSECGEN_getTextHeigth

SYNOPSIS:
       _XSECGEN_getTextHeight(

                    txt_blk
                    units
                )-> offset

DESCRIPTION:
    This function gets the character height for the text block entered
    and returns the combined value .

ARGUMENTS:
    txt_blk         A String of the Text blocknumber
    units           The current drawing units type

RETURNS:
    offset          The combined character height value.
------------------------------------------------------------------------
*/  
defun( _XSECGEN_getTextHeight (txt_blk units)
prog( (offset blkId txtParm)
    txtParm = sprintf( txtParm "paramTextBlock:%s" txt_blk)
    blkId= axlGetParam( txtParm )
    offset = blkId->height
    return( offset )
))

/*
------------------------------------------------------------------------
NAME: _XSECGEN_addLayerTitle

SYNOPSIS:
       _XSECGEN_addLayerTitle(
                    sx
                    sy
                    classSubclass
                    txt_blk
                    lyr_number
                    units
                    xsect_grp
                )-> symbol_dbid

DESCRIPTION:
    This function creates the dielectric layer graphic for the cross section
    ad attaches this graphic element (shape) to the input symbol dbid.

ARGUMENTS:
    sx              The starting graphic x coordinate
    sy              The starting graphic y coordinate
    classSubclass   The String of the drawing layer for the cross section
                     drawing in the form of "CLASS/SUBCLASS"l
    txt_blk         The Text block used for adding text
    lyr_number      An integer definiting the conductor layer number.  
    units           The current drawing units type
    xsect_grp            The DBID of the x-section group


RETURNS:
    l_xy            A List of the layer title xy  coordinates
------------------------------------------------------------------------
*/  
defun( _XSECGEN_addLayerTitle ( sx sy classSubclass txt_blk lyr_number units xsect_grp)
prog( (xoff yoff txt_id)

    ;; set the text offset for right justification
    xoff = sx + _XSECGEN_getTextXOffset(txt_blk units)
    yoff = sy - _XSECGEN_getTextHeight(txt_blk units)

    ;; create the layer title text
    sprintf( layerTitle "LAYER %d" lyr_number)

    ;; add text label to graphics
    axlDBAddGroupObjects( xsect_grp caar( axlDBCreateText( layerTitle
            list( xoff yoff)
            make_axlTextOrientation( ?textBlock txt_blk ?rotation 0.0 ?mirrored nil ?justify "RIGHT")
            classSubclass
            nil
            )
        )
    )
    ;; return the coordinate pair
    return(list( xoff yoff ))
)) /*End of _XSECGEN_addLayerTitle */


/*
------------------------------------------------------------------------
NAME: _XSECGEN_createXsectionSubclass

SYNOPSIS:
        _XSECGEN_createXsectionSubclass(
                layerName
        )-> t

DESCRIPTION:
    Creates and makes visible the inputed CLASS/SUBCLASS. The input
    String for the names must be legal definitions


ARGUMENTS:
    start_x       String of the layer name in the form of "CLASS/SUBCLASS"

RETURNS:
    t
------------------------------------------------------------------------
*/
defun( _XSECGEN_createXsectionSubclass (layerName )
let( ()
    unless( axlIsLayer(layerName)
        axlLayerCreateNonConductor( layerName )
        axlVisibleLayer( layerName  t )
        axlVisibleUpdate(nil)
    )

))

/*
------------------------------------------------------------------------
NAME: _XSECGEN_DrawSingleVia

SYNOPSIS:
        _XSECGEN_DrawSingleVia(
                via_set
                sx
                sy
                units
                classSubclass
                max_layer
                xsect_grp
        )-> newXY

DESCRIPTION:
    This takes in a list of via start layer numbers. It the numbers are
    sequencial, then a call to the uvia graphic is called, otherewise
    the core via function is called.

ARGUMENTS:
    via_set         A list of the via start/end layer numbers
    sx              The starting graphic x coordinate
    sy              The starting graphic y coordinate
    units           The current drawing database units
    classSubclass   the class subclass layer to which the graphics are drawn on
                    in the form of "CLASS/SUBCLASS"
    max_layer       the number of conductor/plane layers.
    xsect_grp            dbid of the xsection group

RETURNS:
    newXY       The graphics right most xy coordinate pair
------------------------------------------------------------------------
*/
defun( _XSECGEN_DrawSingleVia ( via_set sx sy units classSubclass max_layer xsect_grp)
prog( (x y)
    x=0.0
    y=0.0
    isTop = t
    first_lyr = car(car(via_set))
    second_lyr = cadr(car(via_set))
    if( (second_lyr - first_lyr ) > 1 then
        newXY = _XSECGEN_Draw_coreVia(  sx sy units classSubclass first_lyr second_lyr xsect_grp)
    else
         when( first_lyr > (max_layer/2) isTop = nil )
         newXY = _XSECGEN_Draw_uVia( sx sy units classSubclass first_lyr isTop xsect_grp)
    )
return( newXY)
))
/*
------------------------------------------------------------------------
NAME: _XSECGEN_Draw_uVia

SYNOPSIS:
        _XSECGEN_Draw_uVia(
                start_x  start_y units classSubclass start_lyr isTop xsect_grp
        )-> list(right_x : start_y)

DESCRIPTION:
    This function draws the uvia figure into the cross section symbol. This
    figure represents a via passing from one layer to the next layer displaying
    the start and end layer of the drill.

    This graphic is currently drawn as a squared dog bone figure.

    _______           ___
    \     /          /   \
     \   /    or    /     \
      ---           ------

ARGUMENTS:
    start_x       The starting x coordinate for the graphic location.
    start_y       The starting x coordinate for the graphic location.
    units         The current drawing user units
    classSubclass The drawing CLASS/SUBCLASS string to where the graohics are
                    to be drawn
    start_lyr     The integer representation of the starting layer number
    end_lyr       The integer representation of the ending layer number
    isTop         t if uvia is on the top half of the xsection, nil if on the
                  bottom half of the xsection
    xsect_grp     dbid of the xsection group
RETURNS:
    right_x:start_y   The XY coordinate pair where of the right most side.
------------------------------------------------------------------------
*/

defun(  _XSECGEN_Draw_uVia (sx sy units classSubclass first_lyr isTop xsect_grp)
prog( ( xsec_table xOne xTwo xThree xFour yOne yTwo lyrHght path_array )
        ;; is this a uvia drill from top side or bottom side
        xsec_table = _XSECGEN_buildLayerData()
        xOne = sx ; X-plane 1
        xTwo = xOne + axlMKSConvert( .025 "inches" units); X-plane 2
        xThree = xOne + axlMKSConvert( .125 "inches" units); X-plane 3
        xFour = xOne + axlMKSConvert( .150 "inches" units);X-plane 4


        lyrHght = sy
        foreach( lyrDef xsec_table
            when( nth( 4 lyrDef) == first_lyr
                if( isTop then
                    yOne = lyrHght ; Y-plane 1
                else
                    yOne = lyrHght - _XSECGEN_getConductorHeight(units)
                )
            )
            when( nth( 4 lyrDef) == (first_lyr + 1)
                if( isTop then
                    yTwo = lyrHght   ; Y-plane 2
                else
                    yTwo = lyrHght - _XSECGEN_getConductorHeight(units); Y-plane 2
                )
            )
            case( nth(0 lyrDef)
                ( "D"  lyrHght = lyrHght - _XSECGEN_getDielectricHeight(units)) ; set Dielectric graphic layer thickness
                ( "C" lyrHght = lyrHght - _XSECGEN_getConductorHeight(units))
                ( "P" lyrHght = lyrHght - _XSECGEN_getConductorHeight(units))
            )
        )
        if( isTop then
            path_array = axlPathStart( list( xOne : yOne ) 0.0)
                axlPathLine( path_array 0.0 list(xFour yOne) )
                axlPathLine( path_array 0.0 list(xThree yTwo) )
                axlPathLine( path_array 0.0 list(xTwo yTwo) )
                axlPathLine( path_array 0.0 list(xOne yOne) )
        else
            path_array = axlPathStart( list( xTwo : yOne ) 0.0)
                axlPathLine( path_array 0.0 list(xThree yOne) )
                axlPathLine( path_array 0.0 list(xFour yTwo) )
                axlPathLine( path_array 0.0 list(xOne yTwo) )
                axlPathLine( path_array 0.0 list(xTwo yOne) )
        )
        axlDBAddGroupObjects( xsect_grp
                    axlDBCreateShape( path_array
                    _XSECGEN_getCrossHatch("SOLID" units)
                    classSubclass
                    nil nil)
        )
    return( list( xFour sy )); return the starting y and right most coordinates
))
/*
------------------------------------------------------------------------
NAME: _XSECGEN_Draw_coreVia

SYNOPSIS:
        _XSECGEN_Draw_coreVia(
                start_x  start_y  units classSubclass start_lyr end_lyr xsect_grp
        )-> (right_x : start_y)

DESCRIPTION:
    This function draws the core via figure into the cross section symbol. This
    figure represents a multi-layered via displaying the start and end layer
    based o the input arguments

    This graphic is currently drawn as a squared dog bone figure.

    _______
   |_     _|
     |   |
     |   |
    _|   |_
   |_______|

ARGUMENTS:
    start_x       The starting x coordinate for the graphic location.
    start_y       The starting x coordinate for the graphic location.
    units         The current drawing user units
    classSubclass The drawing CLASS/SUBCLASS string to where the graohics are
                    to be drawn
    start_lyr     The integer representation of the starting layer number
    end_lyr       The integer representation of the ending layer number
    xsect_grp     The x-sextion group dbid

RETURNS:
    right_x:start_y   The XY coordinate pair where of the right most side.
------------------------------------------------------------------------
*/  
defun( _XSECGEN_Draw_coreVia (start_x start_y units classSubclass first_lyr second_lyr xsect_grp)
prog( ( xsec_table xOne xTwo xThree xFour yOne yTwo yThree yFour lyrHght path_array)
        xsec_table = _XSECGEN_buildLayerData()

        xOne = start_x ; X-Plane 1
        xTwo = xOne + axlMKSConvert( .025 "inches" units) ; X-plane 2
        xThree = xOne + axlMKSConvert( .125 "inches" units);X-Plane 3
        xFour = xOne + axlMKSConvert( .150 "inches" units); X-plane 4

        lyrHght = start_y
        foreach( lyrDef xsec_table
                when( nth( 4 lyrDef) == first_lyr
                yOne = lyrHght ; Y-plane 1
                yTwo = lyrHght - _XSECGEN_getConductorHeight(units) ; Y-plane 2
            )
            when( nth( 4 lyrDef) == second_lyr
                yThree = lyrHght ; Y-plane 3
                yFour = lyrHght - _XSECGEN_getConductorHeight(units) ; Y-plane 4
            )
            case( nth(0 lyrDef)
                ( "D"  lyrHght = lyrHght - _XSECGEN_getDielectricHeight(units)) ; set Dielectric graphic layer thickness
                ( "C" lyrHght = lyrHght - _XSECGEN_getConductorHeight(units))
                ( "P" lyrHght = lyrHght - _XSECGEN_getConductorHeight(units))
            )
        )
       
        path_array = axlPathStart( list( xOne : yOne) 0.0)
                axlPathLine( path_array 0.0 list(xFour yOne))
                axlPathLine( path_array 0.0 list(xFour yTwo))
                axlPathLine( path_array 0.0 list(xThree yTwo))
                axlPathLine( path_array 0.0 list(xThree yThree))
                axlPathLine( path_array 0.0 list(xFour yThree))
                axlPathLine( path_array 0.0 list(xFour yFour))
                axlPathLine( path_array 0.0 list(xOne yFour))
                axlPathLine( path_array 0.0 list(xOne yThree))
                axlPathLine( path_array 0.0 list(xTwo yThree))
                axlPathLine( path_array 0.0 list(xTwo yTwo))
                axlPathLine( path_array 0.0 list(xOne yTwo))
                axlPathLine( path_array 0.0 list(xOne yOne))

               
        axlDBAddGroupObjects( xsect_grp axlDBCreateShape( path_array t classSubclass nil nil))

    return( list( xFour start_y ));;  return the starting y and right most coordinates
))

/*
------------------------------------------------------------------------
NAME: _XSECGEN_getConductorLayerCount

SYNOPSIS:
        _XSECGEN_getConductorLayerCount(
                xsection_table
        )-> layer_count

DESCRIPTION:
    This function reads the cross section table list and returns
    the total number of combined conductor and plane layers

ARGUMENTS:
    xsection_table   The cross section list created by the
                    _EBA_CXS_buildLayerData function .

RETURNS:
    layer_count   The total number of combined conductor and plane layers.

------------------------------------------------------------------------
*/  
defun(  _XSECGEN_getConductorLayerCount ( xsection_table )
prog( (layer_count)
    layer_count = 0
    foreach( i xsection_table
        when( nth( 4 i) > 0 &&  nth( 4 i) < 100  layer_count++)
    )
    return( layer_count )
))

/*
------------------------------------------------------------------------
NAME: _XSECGEN_grpCreate

SYNOPSIS:
        _XSECGEN_grpCreate( )-> grp_dbid

DESCRIPTION:
    This function check for the existance of a BBV-XSECTION group. If it does
    not exist, it will create the group. If the group already exists, any objects
    attched to the group are deleted, and the blank group dbid is returned.

ARGUMENTS:
    xsection_table   The cross section list created by the
                    _EBA_CXS_buildLayerData function .

RETURNS:
    grp_dbid   returns the bbv x-section group dbid.

------------------------------------------------------------------------
*/  
defun( _XSECGEN_grpCreate ()
prog( ( lst_grps grp_dbid )

    axlDBRefreshId(nil)
    lst_grps = axlDBGetDesign()->groups
    foreach( grp_id lst_grps
        when( upperCase( grp_id->name ) == "BBV-XSECTION"
            when( grp_id->groupMembers axlDeleteObject( grp_id->groupMembers))
            return( grp_id )
        )
    )
    return( axlDBCreateGroup( "BBV-XSECTION" "generic" nil) )
))


该用户从未签到

3#
发表于 2019-5-24 09:27 | 只看该作者
这是什么的skill?

该用户从未签到

5#
发表于 2019-5-27 09:28 | 只看该作者
这个是什么
  • TA的每日心情
    开心
    2019-11-19 15:33
  • 签到天数: 1 天

    [LV.1]初来乍到

    7#
    发表于 2019-12-17 12:37 | 只看该作者
    thanks very much
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-6-10 17:39 , Processed in 0.109375 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表