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 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.
This utility is configured to run two different ways.
- The group below will run the script from the AWRDE using the dialog from the utility.
- 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 | ||||||||
---|---|---|---|---|---|---|---|---|
|
When the utility is done, a data file named "Project_Errors" is added to your project and opened.
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 */ |
This is a page to test the design checker to run the checker and then return the results to this page
Run Check
below, the jason response in the retval has html syntax and I don't know how to tell the json parse to get the entire return value as one string as opposed to trying to parse the results. look at the responses to see how they delimited between the ":", use double quotes. Need to use \ to escape double quotes
HTML |
---|
<input type="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 html = "";
for(var i = 0; i < fnCall.retValue.lenght; i += 1) {
var +="<h3>" + fnCall.retValue[i].Text + "</h3>";
}
obj.innerHTML =html
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>test</p></h2> |
HTML |
---|
<script id="awrscript" type="text/awrscript"> Function highlight_schematic(s As String, e As String, typ As Integer) Dim sc As Schematic Dim sy As SystemDiagram Dim el As Element Dim w As Window If typ = 1 Then'schematic If Project.Schematics.Exists(s) Then Set sc = Project.Schematics(s) Set w = sc.NewWindow 'get view number tmp = w.Caption tks = Split(tmp,":") var fnCall = If UBound(tks) = 0 Then JSON.parse(Response); if (fnCall.errCode == 0) { vn = 1 obj = document.getElementById("results"); var myHtml Else vn=CInt(tks(1)) End If If sc.Elements.Exists(e) Then Set el = sc.Elements(e) el.Selected=True = ""; 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 sc.Views(vn).ZoomSelected alert(fnCall.errMsg); } function run_check() { sc.Views(vn).ZoomOut /* javascript does not wait for function Endcompletion If so we need a callback End If ElseIf typ =function 2if Thenwe 'systemwant diagram a return If Project.SystemDiagrams.Exists(s) Then Set sy = Project.SystemDiagrams(s) Set w = sy.NewWindowvalue */ document.getElementById("results").innerHTML = "Check Running, it might take a while, please be patient" runAwrGlobalScript('Design_Checker','Design_Checker',wait_check); } function awrform_submit() { var x = document.getElementById("design_form"); var text = ""; 'get view numbervar i; for (i = 0; i < x.length ;i++) { if (x.elements[i].checked) { text = text + "1,"; } else { text = text + "0,"; } } <!--document.getElementById("results").innerHTML = text; used to display the control string--> document.getElementById("results").innerHTML = "Check Running, it might take a while, please be 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 String, e As String, typ As Integer) Dim sc As Schematic Dim sy As SystemDiagram Dim el As Element Dim w As Window Dim wds() As Window 'get array of windows ReDim wds(0) '0 index will be blank 'get array of windows For i = 1 To MWOffice.Windows.Count tmp = w.Caption tks = Split(tmp,":") If UBound(tks) = 0 Then vn = 1 Else vn=CInt(tks(1)) End If If sy.Elements.Exists(e) Then Set el = sy.Elements(e) el.Selected=True ReDim sy.Views(vn).ZoomSelectedPreserve wds(i) Set wds(i) sy.Views(vn).ZoomOut= MWOffice.Windows(i) Next i If typ = End1 IfThen'schematic End IfIf Project.Schematics.Exists(s) Then End If End Function Function parse_check() As String Set dntsc = Project.DataFiles("Project_Errors").DataAsTextSchematics(s) tks = Split(dnt,vbLf) found 'make= hmtl0 'If no tab, his h3 'IfFor tab,i use= p1 but need To use the header To Get Type, 1=sch, 2=sys, 3 other For Now. html = "["To UBound(wds) If window_doc(wds(i).Caption) = sc.Name Then For i = 1 To UBound (tks) 'skip first line 'Debug.Print tksIf wds(i) .Type = 9 Then 'schematic 'section titles, but skip If Trim(tks(i)) = "" Then 'skip blanks Set w ElseIf= Leftwds(tks(i),1) <> vbTab Then'found header Select Case tks(i) w.Activate Case "Checking for Obsolete Circuit Models:" w.WindowState=mwWS_Maximized typ = 1 Case "Checking for Obsoletefound System= Models:"1 typ=2 End If Case "Checking for _FREQ in Output Equations:" End If typ=3 'could open up this window, not done yet. Next i If found = 0 Then Case "Checking Layout Settings:" Set w typ=3 'could get access to this dialog box, would be a new case.= sc.NewWindow w.WindowState=mwWS_Maximized End If Case'get "Checking Layout Parameters Precision:"view number tmp = typ=1 w.Caption tks Case= "Checking for Models Connected with Mismatched Widths:"Split(tmp,":") If UBound(tks) = 0 Then typvn = 1 Case "Checking for Shorted Elements:"Else typvn=CInt(tks(1)) Case "Checking for Open Nodes:"End If 'remove any selected elements sc.SelectedElements.RemoveAll If sc.Elements.Exists(e) Then typ=1 Case "CheckingSet forel Overlapping= Elements:"sc.Elements(e) typel.Selected=1True Case "Checking for GDSII Formatted Layers in Drawing Layer List:" sc.Views(vn).ZoomSelected typ=3sc.Views(vn).ZoomOut CaseEnd "CheckingIf if Project PDKs Need Updates:" End If ElseIf typ = 2 Then 'system typ=3diagram If Case ElseProject.SystemDiagrams.Exists(s) Then Set sy typ = 3 = Project.SystemDiagrams(s) found = End0 Select For 'htmli = html1 & "<h3>" & Replace(tks(i),":","") & "</h3>" & vbCrLf To UBound(wds) If InStrwindow_doc(tkswds(i),"Check time".Caption) Then = sy.Name Then html = html & "{""Text"":""" & If tkswds(i).Type & """}" = 12 Then 'schematic Else Set htmlw = html & "{""Text"":""" & tkswds(i) & """}," End If w.Activate 'need to not have comma at the end. Else 'means not header, use type to see if can find schematic/system diagram w.WindowState=mwWS_Maximized If typfound = 1 Then tks2 = Split(tks(i),":") End If s = Trim(Split(tks2(1),",")(0)) End If Next i e = Trim(Split(tks2(2)," ")(1)) If found = 0 Then 'html = html &Set "<pw id=""mwo_highligt"" onclick=""runAwrScript('highlight_schematic','" & s & "','" & e & "','" & 1 & "')"">" & tks(i) & "</p>" & vbCrLf sy.NewWindow w.WindowState=mwWS_Maximized End If 'get view number ElseIf typ = 2 Then tmp = w.Caption tks2 tks = Split(tks(i)tmp,":") sIf UBound(tks) = Trim(Split(tks2(1),",")(0))0 Then evn = Trim(Split(tks2(2)," ")(1)) Else 'html = html & "<p id=""mwo_highligt"" onclick=""runAwrScript('highlight_schematic','" & s & "','" & e & "','" & 2 & "')"">" & tks(i) & "</p>" & vbCrLf vn=CInt(tks(1)) End If 'remove any selected elements Else sy.SelectedElements.RemoveAll 'html = html & "<p>" & tks(i) & "</p>" & vbCrLf If sy.Elements.Exists(e) Then Set el = sy.Elements(e) End If End If Next iel.Selected=True html = html & "]" 'end of json object at top level. sy.Views(vn).ZoomSelected parse_check= html End Function </script> sy.Views(vn).ZoomOut End If End If End If Mwoffice.activate End Function Function window_doc(s As String) As String tks = Split(s,":") tks2 = Split(tks(0),"(") window_doc = tks2(0) End Function Function parse_check() As String dnt = Project.DataFiles("Project_Errors").DataAsText tks = Split(dnt,vbLf) 'make hmtl 'If no tab, his h3 'If tab, use p but need To use the header To Get Type, 1=sch, 2=sys, 3 other For Now. html = "[" start = True For i = 1 To UBound (tks) 'skip first line 'Debug.Print tks(i) 'section titles, but skip If Trim(tks(i)) = "" Then 'skip blanks ElseIf Left(tks(i),1) <> vbTab Then'found header, start new top level object. Select Case tks(i) Case "Checking for Obsolete Circuit Models:" typ = 1 Case "Checking for Obsolete System Models:" typ=2 Case "Checking for _FREQ in Output Equations:" typ=3 'could open up this window, not done yet. Case "Checking Layout Settings:" typ=3 'could get access to this dialog box, would be a new case. Case "Checking Layout Parameters Precision:" typ=1 Case "Checking for Models Connected with Mismatched Widths:" typ=1 Case "Checking for Shorted Elements:" typ=1 Case "Checking for Open Nodes:" typ=1 Case "Checking for Overlapping Elements:" typ=1 Case "Checking for GDSII Formatted Layers in Drawing Layer List:" typ=3 Case "Checking if Project PDKs Need Updates:" typ=3 Case Else typ = 3 End Select 'html = html & "<h3>" & Replace(tks(i),":","") & "</h3>" & vbCrLf If InStr(tks(i),"Check time") Then 'html = html & "{""Text"":""" & tks(i) & """}" If start = True Then 'see if the first object, otherwise need to close it down start=False Else html = html & "] }," End If html = html & "{""Text"":""" & tks(i) & """}" Else If start = True Then 'see if the first object, otherwise need to close it down start=False Else html = html & "] }," End If html = html & "{""Text"":""" & tks(i) & """, ""errors"": [" End If 'need to not have comma at the end. Else 'means not header, use type to see if can find schematic/system diagram If typ = 1 Or typ = 2 Then If InStr(tks(i),"skipped since active window") Then html = html & "{""type"":""" & typ & """,""msg"":""" & Replace(tks(i),vbTab,"")& """}" If Left(tks(i+1),1) = vbTab Then html = html & "," End 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
This check will look for any circuit model that is now considered obsolete and recommend an different model to use. Typically these models issue a warning when simulated but the warning is easy to miss. As a designer you should decide if the obsolete model is okay to continue using in your design.
Obsolete System Models
This check will look for any system model that is now considered obsolete and recommend an different model to use. Typically these models issue a warning when simulated but the warning is easy to miss. As a designer you should decide if the obsolete model is okay to continue using in your design.
_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 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.
Orthogonal Layout Mode
There are several layout options available on the and the Layout tab that help designs not have gaps in layout when building hierarchical designs. The right settings depend on if your layout is orthogonal or not. We find that many designers are not sure which mode they are in and so this check will determine if your layout is orthogonal or not and which options to change if needed.
Model Layout Precision
Many times model parameters can have more precision that the data base unit size of the layout. This typically is not a problem but might cause layouts to not properly snap together.
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.
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.
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.
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.
This check will report any elements that were found in this condition.
GDS Formatted Drawing Layers
This checks for any drawing layers using GDSII formatted drawing layer names. This typically happens when using a model or importing an artwork cell where the correct layers are not already setup. The drawing system will automatically add the layers as drawing layers and model layers. Typically designers like to keep the drawing layer list clean for the named layers they understand for their process. The typical fix is to go into the model layer mapping and map the same model layer to a different drawing layer for your process and then delete this drawing layer.
PDK Version Check
This checks for if there are any newer PDKs 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.