Ifi research: Nanoelectronic: Resources
v("nettnavn") |
velger en spenning fra
simuleringsresultatene. Bruk ?result 'dc for å velge dc
simulering 'ac for ac, osv. En alternativ metode er å
først kalle selectResult('dc), men dette virker ikke fra Analog
Artist |
i("portnavn") |
velger en strøm (fungerer
på en lignende måte som v, man må imidlertid velge
å lagre strømmer i simulator-options først. Det er
ikke default) |
ocnHelp 'funksjonsNavn |
gir hjelp på en
ocn-funksjon. ocnHelp uten parametere gir en liste over en rekke
simuleringsrelaterte funskjoner |
ocnPrint |
Skriver ut simuleringsverdier i
en tabell i icfb-vinduet eller til en fil. Eksempel for å skrive
ut /Out til en fil ved navn "ocnPrint_test": ocnPrint(?output "ocnPrint_test" ?numberNotation 'scientific v("/Out")) |
results |
gir en liste over
simuleringsresultater du har å velge mellom |
selectResult | velger bl.a. hvor man plukker
simuleringsresultater fra. F.eks. fra 'dc 'ac 'tran 'xf osv.. |
plot |
kommando for å plotte
waveforms. Eksempel: plot(v("/Out")) |
mange
kalkulatorfunksjoner |
Skriv ocnHelp for å
få en lang liste over disse. Her begrenser vel bare fantasien
hvordan man kan transformere simuleringsresultatene. |
simulator( 'spectre ) design( "/ifi/fenris/h10/hansbe/st90/Sim/test_ff/spectre/schematic/netlist/netlist") resultsDir( "/ifi/fenris/h10/hansbe/st90/Sim/test_ff/spectre/schematic" ) definitionFile( "models" ) analysis('tran ?stop "1u" ) desVar( "f" 10M ) temp( 27 ) paramAnalysis("f" ?values '(1000000 2154434.690031884 4641588.833612779 10000000 )) paramRun() selectResult( 'tran ) plot(getData("/net1") getData("/net2") getData("/O") ) |
Nå kan vi gjøre en
svært enkel modifikasjon av scriptet for å få
simulatoren til å simulere i fem klokke-perioder. Bytt ut linjen: analysis('tran ?stop "1u" ) Med linjen: analysis('tran ?stop "5/f" ) |
L
value(deriv(i( value(deriv(i(
value(deriv(i( value(deriv(i( W 2.000e-01 8.000e-01 1.400e+00 2.000e+00 1.00000e-01 1.51824e-04 5.49240e-04 9.76026e-04 1.40206e-03 3.40000e+00 5.69143e-06 2.03260e-05 3.95191e-05 5.86385e-05 6.70000e+00 2.90735e-06 1.03699e-05 2.01589e-05 2.99106e-05 1.00000e+01 1.95103e-06 6.95525e-06 1.35179e-05 2.00554e-05 |
0
2.000e-01
8.000e-01
1.400e+00
2.000e+00 1.00000e-01 1.51824e-04 5.49240e-04 9.76026e-04 1.40206e-03 3.40000e+00 5.69143e-06 2.03260e-05 3.95191e-05 5.86385e-05 6.70000e+00 2.90735e-06 1.03699e-05 2.01589e-05 2.99106e-05 1.00000e+01 1.95103e-06 6.95525e-06 1.35179e-05 2.00554e-05 |
M = dlmread('testdata.txt','',[0
0 4 4]) |
M = 0 0.2000 0.8000 1.4000 2.0000 0.1000 0.0002 0.0005 0.0010 0.0014 3.4000 0.0000 0.0000 0.0000 0.0001 6.7000 0.0000 0.0000 0.0000 0.0000 10.0000 0.0000 0.0000 0.0000 0.0000 |
% Lager nå ett
overflateplott i Matlab: surf(M(1,2:5),M(2:5,1),log(M(2:5,2:5))) |
; hiSetBindKeys brukes til
å sette bindkeys, mens "Layout" forteller funksjonen at det er
bind-keys til layouteditoren vi ønsker å definere hiSetBindKeys( "Layout" list( list("<Key>1" "leSetEntryLayer(\"M1\")") ; leSetEntryLayer sier hvilket lag som er aktivt/vi skal tegne med list("<Key>2" "leSetEntryLayer(\"M2\")") list("<Key>3" "leSetEntryLayer(\"M3\")") list("<Key>4" "leSetEntryLayer(\"PO\")") list("<Key>5" "leSetEntryLayer(\"OD\")") list("<Key>6" "leSetEntryLayer(\"NP\")") list("<Key>7" "leSetEntryLayer(\"PP\")") list("<Key>8" "leSetEntryLayer(\"NW\")") list("<Key>9" "leSetEntryLayer(\"TMP\")") list("Ctrl<Key>1" "leSetAllLayerVisible(t), hiRedraw()") ; Ctrl-1 setter alle lag synlige og tegner på nytt, se under printf-kommandoen lenger ned for å se hva de andre tastetrykkene gjør. list("Ctrl<Key>2" "leSetAllLayerVisible(nil), leSetLayerVisible(\"TMP\" t), leSetLayerVisible(\"align\" t), hiRedraw()") list("Ctrl<Key>3" "leSetAllLayerSelectable(t)") list("Ctrl<Key>4" "leSetAllLayerSelectable(nil), leSetLayerSelectable(leGetEntryLayer() t)") list("Ctrl<Key>5" "leSetAllLayerVisible(nil), leSetLayerVisible(\"TMP\" t), leSetLayerVisible(\"align\" t), leSetLayerVisible(\"OD\" t), leSetLayerVisible(\"CO\" t), leSetLayerVisible(\"PO\" t), leSetLayerVisible(\"NP\" t), leSetLayerVisible(\"PP\" t), leSetLayerVisible(\"NW\" t), hiRedraw()") list("Ctrl<Key>6" "leSetAllLayerVisible(nil), leSetLayerVisible(\"TMP\" t), leSetLayerVisible(\"align\" t), leSetLayerVisible(\"OD\" t), leSetLayerVisible(\"CO\" t), leSetLayerVisible(\"PO\" t), leSetLayerVisible(\"M1\" t), hiRedraw()") list("Ctrl<Key>7" "leSetAllLayerVisible(nil), leSetLayerVisible(\"TMP\" t), leSetLayerVisible(\"align\" t), leSetLayerVisible(\"M1\", t), leSetLayerVisible(\"VIA1\", t), leSetLayerVisible(\"M2\", t), hiRedraw()") list("Ctrl<Key>8" "leSetAllLayerVisible(nil), leSetLayerVisible(\"TMP\" t), leSetLayerVisible(\"align\" t), leSetLayerVisible(\"M2\", t), leSetLayerVisible(\"VIA2\", t), leSetLayerVisible(\"M3\", t), hiRedraw()") list("Ctrl<Key>9" "leSetAllLayerVisible(nil), leSetLayerVisible(\"TMP\" t), leSetLayerVisible(\"align\" t), leSetLayerVisible(\"M3\", t), leSetLayerVisible(\"VIA3\", t), leSetLayerVisible(\"M4\", t), hiRedraw()") )) printf("Added custom bindkeys for the layout editor:\n"), printf("Key: 1 Set layer \"M1\"\n"), printf("Key: 2 Set layer \"M2\"\n"), printf("Key: 3 Set layer \"M3\"\n"), printf("Key: 4 Set layer \"PO\"\n"), printf("Key: 5 Set layer \"OD\"\n"), printf("Key: 6 Set layer \"NP\"\n"), printf("Key: 7 Set layer \"PP\"\n"), printf("Key: 8 Set layer \"NW\"\n"), printf("Key: 9 Set layer \"align\" (for notes, alignment shapes, etc.)\n"), printf("Key: 0 Set layer \"TMP\" (for notes, alignment shapes, etc.)\n"), printf("Fot the following visibility commands layers TMP and align are always visible." printf("Key: Ctrl-1 Sets all layers visible."), printf("Key: Ctrl-2 Sets none but active layer visible. \n"), printf("Key: Ctrl-3 Sets all layers selectable. \n"), printf("Key: Ctrl-4 Sets none but current layer (and instances) selectable. \n") printf("Keys Ctrl-5 to Ctrl-9 sets the following sets of layers visible\n in addition to the current drawing layer:\n"), printf("Ctrl-5 : OD, CO, PO, NP, PP and NW\n"), printf("Ctrl-6 : OD, CO, PO and M1\n"), printf("Ctrl-7 : M1, VIA1 and M2\n"), printf("Ctrl-8 : M2, VIA2 and M3\n"), printf("Ctrl-9 : M3, VIA3 and M4\n") |
procedure(
leToggleSnapMode(l_validModes) ; her definerer vi prosedyren og antall
parametere/navn på disse prog((i next curMode) ; i next og curMode er lokale variable curMode = envGetVal("layout" "segSnapMode") ; ved hjelp envGetVal finner vi hvilken modus som er valgt nå next = 0 ; vi skal lagre i next hvilken modus som skal velgse neste gang ; vi traverserer så input listen og sjekker om det forrige elementet var et som var angitt i listen for(i 1 length(l_validModes) if((curMode==nth(i-1 l_validModes)) then next = i ) ) ; hvis det elementet vi fant var det siste i listen starter vi fra begynnelsen igjen if((next==length(l_validModes)) then next = 0 ) ; setter så snap mode: leSetFormSnapMode(nth(next l_validModes)) ; må også si fra med envSetVal envSetVal("layout" "segSnapMode" 'string nth(next l_validModes)) ; utskrift til icfb-vinduet? ; printf("Set snap to: %s" nth(next l_validModes)) ) ) ; kan nå definere tastetrykk som kan benytte denne fnuskjonen: hiSetBindKeys( "Layout" list( list("Shift<Key>1" "leToggleSnapMode(list(\"diagonal\" \"anyAngle\"))") list("Shift<Key>2" "leToggleSnapMode(list(\"orthogonal\" \"diagonal\"))") list("Shift<Key>3" "leToggleSnapMode(list(\"L90XFirst\" \"L90YFirst\"))") )) ; Hva tastene da gjør: ; Shift-1veksler mellom diagonal snap mode og anyAngle (fri flytting) ; Shift-2veksler mellom ortogonal (loddrett og vannrett) og diagonal ; Shift-1veksler mellom L90XFirst og L90YFirst, som er uvurderlige når man ønsker å tegne paths med 90 graders vinkler |
procedure( pitch_projection_centered( num_elms pitch1 pitch2 t_layer mpw mps output_library) ;; mpw ~ metal path width ;; mps ~ metal path spacing ;; pitch1 ~ input leaves spacing ;; pitch2 ~ output leaves spacing ;; t_layer ~ layer text ex. "M1" ;; Example of use: ;; pitch_projection_new(16 1 0.4 "M3" 0.14 0.26 "test_st90") prog( (num_elms_str pitch1_str pitch2_str cell_name i base2 voff vxtra vsp view_name) min_sp = 0.005 ;; the minimum spacing of points sprintf(num_elms_str "%d" num_elms) sprintf(pitch1_str "%d_%d" fix(pitch1) fix(1000*(pitch1-fix(pitch1)))) sprintf(pitch2_str "%d_%d" fix(pitch2) fix(1000*(pitch2-fix(pitch2)))) cell_name="pitch_projection_layouts" view_name=strcat("pplocc_" t_layer "_" num_elms_str "_" pitch1_str "_to_" pitch2_str) ; åpner et cellview dbcv=dbOpenCellViewByType( output_library cell_name view_name "maskLayout" "w") ; obs "w" mode overskriver det man har lagret i et cellview. if((pitch1<pitch2) then i=pitch2 pitch2=pitch1 pitch1=i );if vsp = (num_elms/2)*(mpw + mps) vsp = floor(vsp/min_sp)*min_sp voff = vsp vxtra = ceiling((0.5*mpw+mps)/min_sp)*min_sp direction = -1 base2 = ((num_elms-1)*(pitch1-pitch2))/2 base2 = floor(base2/min_sp)*min_sp for( i 0 num_elms-1 dbCreatePath(dbcv t_layer list(0:i*pitch1 voff:i*pitch1 voff:base2+i*pitch2 vsp+vxtra:base2+i*pitch2) mpw ) ; dbCreatePath tar som input det cellview man vil tegne i, hvilket lag man skal tegne i, en liste med punkter og en bredde på banen man vil tegne. if(((i+1)>num_elms/2) then direction=1 );if if(((i+1)==(num_elms/2)) then direction=1 else voff=voff+direction*(met_path_width+met_path_spacing) ); );for dbSave(dbcv) ); prog ); procedure |
Ved testkjøring av
kommandoen over genereres følgende utlegg (rotert 90 grader her): |