Page tree

Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

The Design Checker is a collection of checks to look for mistakes in your design that are hard to spot in designs, especially big or complex designs.   The script utility allows you to configure the checks you would like to run and then displays any errors that were found in either the current project or the active schematic or system diagram.   

Run Check

 

HTML
 <input type="button" class="gh-button" value="Run Design Checker" onclick="run_check();">
<script type="text/javascript">
    function return_html(Response) {
        /* this gets called once runAwrScript is complete */
        var fnCall = JSON.parse(Response);
        if (fnCall.errCode == 0) {
                obj = document.getElementById("results");
				var myHtml = "";
				 for(var i = 0; i < fnCall.retValue.length; i += 1) {
					 myHtml +="<h3>" + fnCall.retValue[i].Text + "</h3>";
	
					if (i < fnCall.retValue.length-1 ) {
					 	var errs = fnCall.retValue[i].errors;
					 	for (var ind = 0; ind < errs.length; ind += 1) {
							myHtml += "<p id=\"mwo_higlight\" onclick = \"runAwrScript('highlight_schematic','" + errs[ind].doc + "','" + errs[ind].elem + "','" + errs[ind].type + "');\">" + errs[ind].msg + "</p>";
						}
					}
				
				 }
				obj.innerHTML =myHtml
  			}
		
		 else
            alert("Failed to get project name");
    }
    function run_check()
    {
        /* javascript does not wait for function completion so we need a callback
           function if we want a return value */
        runAwrGlobalScript('Design_Checker','Design_Checker');
        runAwrScript('parse_check', return_html);
    }
</script>

 

Review Results

HTML
 <h2 id="results"><p>Results will be here</p></h2>

...

This utility is configured to run two different ways.

  1. The group below will run the script from the AWRDE using the dialog from the utility.  
  2. There is a form lower down that runs and returns the errors to this page.  Any error with a link will browse the program to that error, offering more capability than the previous way to run.

Run Check from the AWRDE

Awr script page macro
FunctionNameDesign_Checker
ScriptPathScript &rarr; Project &rarr; Design_Checker
ButtonLabelRun Script
ModuleNameDesign_Checker

When the utility is done, a data file named "Project_Errors" is added to your project and opened.

Image Added

If the data file "Project_Errors" is in the project, the script will remember the last checks you ran and will have those checks enabled in the dialog. Each will overwrite the "Project_Errors" file, you should make a copy of the file if you want to keep results around.

Run Check from this Website

HTML
 <form id = "design_form">
 <input type="checkbox" name="sch_obs" value="1" checked="true">Obsolete Circuit Models (recommended replacement listed)<br>
  <input type="checkbox" name="sys_obs" value="1" checked="true">Obsolete System Models (recommended replacement listed)<br> 
  <input type="checkbox" name="freq" value="1" checked="true">_FREQ in Output Equations (recommended equation solution listed)<br>
  <input type="checkbox" name="layout_opts" value="1" checked="true">Layout Options (list options needed for layout style found)<br>
  <input type="checkbox" name="layout_prec" value="1" checked="true">Model Layout Precision (list layout parameter with more precision that the DBU)<br>   
  <input type="checkbox" name="width_mismatch" value="1" checked="true">Mismatched Widths (check for connected models with widths that are not matched)<br>    
  <input type="checkbox" name="shorted" value="1" checked="true">Shorted Circuit Elements (list models with all nodes shorted)<br>   
  <input type="checkbox" name="open" value="1" checked="true">Open Circuit Nodes (list models with nodes not connected)<br> 
  <input type="checkbox" name="overlap" value="1" checked="true">Overlapping Circuit Elements (list models that are completely overlapping)<br>  
  <input type="checkbox" name="gds_layers" value="1" checked="true">GDS Formatted Drawing Layers (Lists any GDSII formatted Drawing Layers)<br>  
  <input type="checkbox" name="gds_layers" value="1" checked="true">PDK Version Check (Checks the existing PDKs and see if there is a newer version available)<br>  
  How Much to Check <br>
  <input type="radio" name="check_type" value="entire" checked="true">Entire Design<br>   
  <input type="radio" name="check_type" value="active">Active Schematic/System Diagram<br>
 </form>

 

 

HTML
<input type="button" class="gh-button" value="Run Design Checker From Website" onclick="awrform_submit();">
<br>
<!--<input type="button" class="gh-button" value="Run Design Checker with VB UI" onclick="run_check();">-->
<script type="text/javascript">
    function wait_check(Response) {
		runAwrScript('parse_check', return_html);
 }
    function control_check(Response) { 	 	
		runAwrGlobalScript('Design_Checker','Design_Checker',wait_check);
}
	function return_html(Response) {
        /* this gets called once runAwrScript is complete */
        var fnCall = JSON.parse(Response);
        if (fnCall.errCode == 0) {
                obj = document.getElementById("results");
				var myHtml = "";
				 for(var i = 0; i < fnCall.retValue.length; i += 1) {
					 myHtml +="<h3>" + fnCall.retValue[i].Text + "</h3>";
	
					if (i < fnCall.retValue.length-1 ) {
					 	var errs = fnCall.retValue[i].errors;
					 	for (var ind = 0; ind < errs.length; ind += 1) {
							
							if (typeof(errs[ind].doc) == "undefined") {
								myHtml += "<p>" + errs[ind].msg + "</p>";
								
							}
							else {
								myHtml += "<p><a  class=\"external-link\" rel=\"nofollow\" onclick = \"runAwrScript('highlight_schematic','" + errs[ind].doc + "','" + errs[ind].elem + "','" + errs[ind].type + "');\">" + errs[ind].msg + "</a></p>"; 
							}
						}
					}
				
				 }
				obj.innerHTML =myHtml
  			}
		
		 else
          found = 0 alert(fnCall.errMsg);
    }
    function run_check()
 For i = 0{
To UBound(wds)       /* javascript does not wait for function completion so we If window_doc(wds(i).Caption) = sc.Name Thenneed a callback
           function if we want a return value     If wds(i).Type*/
		document.getElementById("results").innerHTML = 9"Check ThenRunning, 'schematicit might take a while, please be patient"
		runAwrGlobalScript('Design_Checker','Design_Checker',wait_check);
    }
     function awrform_submit()
	{
	var x  Set w = wds(i)document.getElementById("design_form");
    var text = "";
    var i;
    for (i = 0; i < wx.Activatelength ;i++) {
		if (x.elements[i].checked) {
			text = text + "1,";
		 }	
		else {
			text = text + "0,";
		}
    }
w.WindowState=mwWS_Maximized    <!--document.getElementById("results").innerHTML = text; used to display the control  string-->

	document.getElementById("results").innerHTML = "Check Running, it might take a while, please foundbe = 1
patient"
	runAwrScript('Design_Checker_Control_File',text, control_check);
    
 }
 </script>

Review Results

HTML
 <h2 id="results"><p></p></h2>
HTML
<script id="awrscript" type="text/awrscript">
    Function highlight_schematic(s As EndString, Ife As String, typ As Integer)
    Dim sc As Schematic
   End IfDim sy As SystemDiagram
    Dim el As Element
 Next i  Dim w As Window
    Dim wds() As IfWindow
found = 0 Then'get array of windows 
    ReDim wds(0) '0 index will be blank
 Set w = sc.NewWindow'get array of windows
    For i = 1 To EndMWOffice.Windows.Count
If         ReDim    'get view numberPreserve wds(i)
        Set      tmp wds(i) = w.CaptionMWOffice.Windows(i)
    Next i


    If tkstyp = Split(tmp,":")
1 Then'schematic
           If UBound(tks) = 0 Project.Schematics.Exists(s) Then
            Set  sc  vn = 1Project.Schematics(s)
            Elsefound = 0
            For i vn=CInt(tks(1))
  1 To UBound(wds)
          End If     If window_doc(wds(i).Caption) =      If sc.Elements.Exists(e)Name Then
                Set   el =If sc.Elementswds(ei).Type = 9 Then  'schematic
           el.Selected=True             Set w =  sc.Views(vn).ZoomSelectedwds(i)
                  sc.Views(vn).ZoomOut      w.Activate
      End If         End If     ElseIf typ w.WindowState=mwWS_Maximized
2   Then 'system diagram         If Project.SystemDiagrams.Exists(s) Then        found = 1
  Set sy = Project.SystemDiagrams(s)             found = 0End If
           For i = 0 To UBound(wds)End If
            Next i
 If window_doc(wds(i).Caption) = sy.Name Then       If found = 0 Then
         If wds(i).Type = 12 Then 'schematic  Set w = sc.NewWindow
		w.WindowState=mwWS_Maximized
            End If
    Set w = wds(i)     'get view number
            tmp =    w.ActivateCaption
            tks = Split(tmp,":")
         w.WindowState=mwWS_Maximized   If UBound(tks) = 0 Then
                vn found = 1
            Else
       End If        vn=CInt(tks(1))
        End If   End If
			'remove any selected elements
    Next i             If found = 0 sc.SelectedElements.RemoveAll
			If sc.Elements.Exists(e) Then
                Set wel = sy.NewWindowsc.Elements(e)
            End If   el.Selected=True
         'get view number     sc.Views(vn).ZoomSelected
       tmp = w.Caption         sc.Views(vn).ZoomOut
            tksEnd If
= Split(tmp,":")       End If
    If UBound(tks)ElseIf typ = 02 Then 'system diagram
        If Project.SystemDiagrams.Exists(s) Then
   vn   = 1     Set sy = Project.SystemDiagrams(s)
    Else        found = 0
      vn=CInt(tks(1))      For i = 1 To UBound(wds)
  End If             If window_doc(wds(i).Caption) = sy.Elements.Exists(e)Name Then
                Set   el =If sy.Elementswds(ei).Type = 12 Then 'schematic
             el.Selected=True           Set w = wds(i)
  sy.Views(vn).ZoomSelected                 sy.Views(vn).ZoomOut     w.Activate
            End If         End If w.WindowState=mwWS_Maximized
   End If End Function Function window_doc(s As String) As String     tks = Split(s,":")     tks2found = Split(tks(0),"(")1
    window_doc = tks2(0) End Function Function parse_check() As String      dnt = Project.DataFiles("Project_Errors").DataAsText End If
    tks = Split(dnt,vbLf)     'make hmtl    End 'If
no  tab, his h3     'If tab, use pNext buti
need To use the header To Get Type, 1=sch, 2=sys, 3 other ForIf Now.found = 0 Then
 html = "["     start = True      ForSet iw = 1 To UBound (tks) 'skip first linesy.NewWindow
		w.WindowState=mwWS_Maximized
            End If
  'Debug.Print tks(i)         'section titles, but skipget view number
           If Trim(tks(i)) tmp = "" Then 'skip blanksw.Caption
            tks ElseIf= Left(tks(i),1Split(tmp,":")
<> vbTab Then'found header, start new top level object.    If UBound(tks) = 0 Then
    Select Case tks(i)          vn = 1
Case "Checking for Obsolete Circuit Models:"       Else
         typ = 1     vn=CInt(tks(1))
       Case "Checking for Obsolete System Models:"End If
			'remove any selected elements
           typ=2
 sy.SelectedElements.RemoveAll
           Case "Checking for _FREQ in Output Equations:"If sy.Elements.Exists(e) Then
                Set el typ=3 'could open up this window, not done yet. sy.Elements(e)
                el.Selected=True
  Case "Checking Layout Settings:"           sy.Views(vn).ZoomSelected
     typ=3 'could get access to this dialog box, would be a new case. sy.Views(vn).ZoomOut
            CaseEnd "CheckingIf
Layout Parameters Precision:"      End If
    End If
	Mwoffice.activate
End Function
typ=1
    Function window_doc(s As String) As String
    tks =  Case "Checking for Models Connected with Mismatched Widths:"Split(s,":")
    tks2 = Split(tks(0),"(")
    window_doc = tks2(0)
End Function
Function parse_check() As String

  typ=1  dnt = Project.DataFiles("Project_Errors").DataAsText
    tks = Split(dnt,vbLf)
 Case "Checking for Shorted Elements:"'make hmtl
    'If no tab, his h3
    'If tab, use typ=1p but need To use the header To Get Type, 1=sch, 2=sys, 3 Caseother "CheckingFor forNow.
Open Nodes:"   html = "["
    start = True

   typ=1 For i = 1 To UBound (tks) 'skip first line
  Case "Checking for Overlapping Elements:"  'Debug.Print tks(i)
        'section titles, but skip
 typ=1       If Trim(tks(i)) =    Case "Checking for GDSII Formatted Layers in Drawing Layer List:" Then 'skip blanks
        ElseIf Left(tks(i),1) <> vbTab  typ=3
    Then'found header, start new top level object.
       Case "Checking if Project PDKs NeedSelect Updates:"
Case tks(i)
            Case "Checking for typ=3Obsolete Circuit Models:"
          Case Else     typ = 1
         typ = 3 Case "Checking for Obsolete System Models:"
       End Select        typ=2
     'html = html & "<h3>" & Replace(tks(i),":","") & "</h3>" & vbCrLf  Case "Checking for _FREQ in Output Equations:"
                If InStr(tks(i),"Check time") Then
    typ=3 'could open up this window, not done yet.
           'html =Case html"Checking & "{""Text""Layout Settings:"""
 &  tks(i) & """}"           typ=3 'could get access to this dialog box, Ifwould startbe =a Truenew Thencase.
'see if the first object, otherwise need to close it down  Case "Checking Layout Parameters Precision:"
              start=False  typ=1
            Case "Checking Elsefor Models Connected with Mismatched Widths:"
               html typ=1
html & "] },"         Case "Checking for Shorted Elements:"
   End If            typ=1
    html = html & "{""Text"":""" &  tks(i) &Case """}"Checking for Open Nodes:"
         Else       typ=1
         If start = TrueCase Then"Checking 'seefor ifOverlapping theElements:"
first object, otherwise need to close it down         typ=1
           start=False Case "Checking for GDSII Formatted Layers in Drawing Layer List:"
      Else           typ=3
         html = html &Case "]Checking },"if Project PDKs Need Updates:"
            End If   typ=3
            Case htmlElse
= html & "{""Text"":""" &  tks(i) & """, ""errors"": ["      typ = 3
    End If       End Select

   'need to not have comma at the end.  'html = html & "<h3>" & Replace(tks(i),":","") & Else 'means not header, use type to see if can find schematic/system diagram
     "</h3>" & vbCrLf
            If InStr(tks(i),"Check time") Then
      If typ = 1 Or typ = 2  Then 'html = html & "{""Text"":""" &  tks(i) & """}"

          tks2    = Split(tks(i),":")
                s = Trim(Split(tks2(1),",")(0)) If start = True Then 'see if the first object, otherwise need to close it down
                   e start= Trim(Split(tks2(2)," ")(1))False
                Else
         e = Replace(e,",","") 'one check has comma aftter element.    				'html = html & "<p] id=""mwo_highligt"" onclick=""runAwrScript('highlight_schematic','" & s & "','" & e & "','" & 1 & "')"">" & tks(i) & "</p>" & vbCrLf},"
                End If
                html = html & "{""docText"":""" & s tks(i) & """,""elem"":""" & e & """,""type"":""" & typ & """,""msg"":""" & Replace(tks(i),vbTab,"")& """}"}"
            Else
                If start = 'determineTrue nextThen line'see if itthe isfirst anotherobject, errorotherwise orneed newto categoryclose toit getdown
array separator right                 If Left(tks(i+1),1) = vbTab Then start=False
                Else
     html                html = html & "] },"
                End If
                'needshtml a= commahtml between items but not at the end
 & "{""Text"":""" &  tks(i) & """, ""errors"": ["
          Else  End If
            'need 'justto printnot messageshave herecomma andat the typeend.

        Else 'means not header, use type  html = html & "{""type"":""" & typ & """,""msg"":""" & Replace(tks(i),vbTab,"")& """}"
           to see if can find schematic/system diagram
            If typ = 1 Or typ = 2  Then
    If Left(tks(i+1),1) = vbTab            If InStr(tks(i),"skipped since active window") Then
                    html = html & ",{""type"":""" & typ & """,""msg"":""" &    Replace(tks(i),vbTab,"")& """}"
       End If             End If
If Left(tks(i+1),1) = vbTab Then
            End If     Next i     html = html & ","
 ]" 'end of json object at top level.                 parse_check= html End Function
</script> 

To Do

  1. How to get the JavaScript to wait for the vb code to be finished.  
  2. For opening window and highlight, don't open new window if already opened.  This is an update in the VBCode that does this. 
  3. for the html created, need to have a class not an id so we can format all of those links as one.  
  4. Get rest of the page on here from the KB
  5. Build the form in html that controls the code.  Will have to reformat the VB Code to take input for this control.  Need to think how that would work.  

Lessons Learned

...

If
                Else
                    tks2 = Split(tks(i),":")
                    s = Trim(Split(tks2(1),",")(0))
                    e = Trim(Split(tks2(2)," ")(1))
                    e = Replace(e,",","") 'one check has comma aftter element.
                    'html = html & "<p id=""mwo_highligt"" onclick=""runAwrScript('highlight_schematic','" & s & "','" & e & "','" & 1 & "')"">" & tks(i) & "</p>" & vbCrLf
                    html = html & "{""doc"":""" & s & """,""elem"":""" & e & """,""type"":""" & typ & """,""msg"":""" & Replace(tks(i),vbTab,"")& """}"
                    'determine next line if it is another error or new category to get array separator right
                    If Left(tks(i+1),1) = vbTab Then
                        html = html & ","
                    End If
                End If
                'needs a comma between items but not at the end
            Else
                'just print messages here and the type.
                html = html & "{""type"":""" & typ & """,""msg"":""" & Replace(tks(i),vbTab,"")& """}"
                If Left(tks(i+1),1) = vbTab Then
                    html = html & ","
                End If
            End If
        End If
    Next i
    html = html & "  ]" 'end of json object at top level.
    parse_check= html
End Function
Sub Design_Checker_Control_File(s As String)  
   Dim dctrl As DataFile  
   fn = "Design_Checker_Control"  
   If Project.DataFiles.Exists(fn) Then   
      Project.DataFiles.Remove(fn)  
   End If  
   Set dctrl = Project.DataFiles.Add(fn,fn,True,mwDFT_TXT)  
   dctrl.DataAsText=s 
End Sub
</script> 

 

Error Types Descriptions

Obsolete Circuit Models

...

_FREQ in Output Equations

Many times while writing output equations, you will want to also get the frequencies associated with any measurement (or any other measurement's x-axis values). People have used _FREQ built in variable in the past. This variable can changed change based on simulation order which means equations that work at one point could not work when a design changes. The better approach is to the "swpval(x)" function where x would be the result of an output equation.

...

Mismatched Widths

This checks for any models that are connected that have widths parameters that do not match. We prefer users to use intelligent models (where a model can get its width from the model it is connected to), however many customers do not and can have data entry errors where widths of connecting models should match but do not. For example, when using equations, it is possible to type the wrong equation values as shown below.

Image RemovedImage Added

This check will report any elements that were found in this condition.

Shorted Circuit Elements

This checks for any models that are enabled but have all of their nodes shorted together. This condition is typically a case where a designer intended to disable an element and did not.

Image RemovedImage Added

This check will report any elements that were found in this condition.

Open Circuit Elements

This checks for any models that are enabled and have nodes that are not connected to anything. This condition is typically a case where a designer overlapped nodes to connect them and miss placed a part. The picture below shows this case where the nodes of both resistors are not overlapped. In a big schematic this error would be difficult to spot.

Image RemovedImage Added

This check will report any elements that were found in this condition.

Overlapping Circuit Elements

This checks for any models that are exactly on top of one another. The picture below shows this case where the left resistor looks like there is one resistor, but actually there are two that are exactly overlapping.

Image RemovedImage Added

This check will report any elements that were found in this condition.

...

PDK Version Check

This checks for if there are any newer PDKs availabe available for the existing PDK's in the project. The check goes through each existing PDKs one by one and then goes through the AWR PDK Availibility library in the vendor libraries and see if there is a newer version of the PDK available. Then it informs the user of the result. You need to have internet connection to run this check.