Commit ad615b454a7d47d931a918a21309bf0da56671a5
1 parent
c78a9409
Exists in
master
and in
3 other branches
Add incident field pins to LTspice and Ngspice schematic symbols
Showing
2 changed files
with
113 additions
and
184 deletions
Show diff stats
SOFTWARE_NOTES/work_log.txt
SRC/CREATE_SPICE_CIRCUIT_MODEL/create_spice_subcircuit_symbol.F90
| ... | ... | @@ -29,7 +29,6 @@ |
| 29 | 29 | ! File Contents: |
| 30 | 30 | ! SUBROUTINE create_spice_subcircuit_symbol_NGspice |
| 31 | 31 | ! SUBROUTINE create_spice_subcircuit_symbol_LTspice |
| 32 | -! SUBROUTINE create_spice_subcircuit_symbol_Pspice | |
| 33 | 32 | ! |
| 34 | 33 | ! NAME |
| 35 | 34 | ! create_spice_subcircuit_symbol_NGspice |
| ... | ... | @@ -118,6 +117,11 @@ character(len=line_length) :: pinlabel_string |
| 118 | 117 | |
| 119 | 118 | ymax_symbol=ymin_offset+(n_conductors-1)*y_conductor_spacing+ymax_offset |
| 120 | 119 | |
| 120 | +! add a space for the incident field nodes | |
| 121 | + if (spice_bundle_model%include_incident_field) then | |
| 122 | + ymax_symbol=ymax_symbol+y_conductor_spacing | |
| 123 | + end if | |
| 124 | + | |
| 121 | 125 | ! end 1 pin parameters # this could maybe go with parameters in the module... |
| 122 | 126 | xpin1(1)=xmin_symbol-x_pin_length |
| 123 | 127 | xpin2(1)=xmin_symbol |
| ... | ... | @@ -175,6 +179,59 @@ character(len=line_length) :: pinlabel_string |
| 175 | 179 | end do ! next conductor |
| 176 | 180 | |
| 177 | 181 | end do ! other cable end |
| 182 | + | |
| 183 | +! add a space for the incident field nodes | |
| 184 | + if (spice_bundle_model%include_incident_field) then | |
| 185 | + | |
| 186 | +! put the first Einc pin on the LHS of the symbol | |
| 187 | + end=1 | |
| 188 | + pin=pin+1 | |
| 189 | + ypin=ymax_symbol-ymax_offset-(n_conductors)*y_conductor_spacing | |
| 190 | + | |
| 191 | + string1='pinnumber=' | |
| 192 | + CALL add_integer_to_string(string1,pin,pinnumber_string) | |
| 193 | + | |
| 194 | + string1='pinseq=' | |
| 195 | + CALL add_integer_to_string(string1,pin,pinseq_string) | |
| 196 | + | |
| 197 | + pinlabel_string='Einc1' | |
| 198 | + write(symbol_file_unit,'(A,4I6,A)')'P ',xpin1(end),ypin,xpin2(end),ypin,' 1 0 0' | |
| 199 | + write(symbol_file_unit,'(A)')'{' | |
| 200 | + write(symbol_file_unit,'(A)')'T 150 250 5 8 0 0 0 6 1' | |
| 201 | + write(symbol_file_unit,'(A)')trim(pinnumber_string) | |
| 202 | + write(symbol_file_unit,'(A)')'T 150 150 5 8 0 0 0 8 1' | |
| 203 | + write(symbol_file_unit,'(A)')trim(pinseq_string) | |
| 204 | + write(symbol_file_unit,'(A,2I6,A,I3,A)')'T ',xpin_label(end),ypin,' 9 6 1 1 0 ',align_label(end),' 1' | |
| 205 | + write(symbol_file_unit,'(A)')trim(pinlabel_string) | |
| 206 | + write(symbol_file_unit,'(A)')'T 200 200 5 8 0 0 0 2 1' | |
| 207 | + write(symbol_file_unit,'(A)')'pintype=pas' | |
| 208 | + write(symbol_file_unit,'(A)')'}' | |
| 209 | + | |
| 210 | +! put the first Einc pin on the LHS of the symbol | |
| 211 | + end=2 | |
| 212 | + pin=pin+1 | |
| 213 | + ypin=ymax_symbol-ymax_offset-(n_conductors)*y_conductor_spacing | |
| 214 | + | |
| 215 | + string1='pinnumber=' | |
| 216 | + CALL add_integer_to_string(string1,pin,pinnumber_string) | |
| 217 | + | |
| 218 | + string1='pinseq=' | |
| 219 | + CALL add_integer_to_string(string1,pin,pinseq_string) | |
| 220 | + | |
| 221 | + pinlabel_string='Einc2' | |
| 222 | + write(symbol_file_unit,'(A,4I6,A)')'P ',xpin1(end),ypin,xpin2(end),ypin,' 1 0 0' | |
| 223 | + write(symbol_file_unit,'(A)')'{' | |
| 224 | + write(symbol_file_unit,'(A)')'T 150 250 5 8 0 0 0 6 1' | |
| 225 | + write(symbol_file_unit,'(A)')trim(pinnumber_string) | |
| 226 | + write(symbol_file_unit,'(A)')'T 150 150 5 8 0 0 0 8 1' | |
| 227 | + write(symbol_file_unit,'(A)')trim(pinseq_string) | |
| 228 | + write(symbol_file_unit,'(A,2I6,A,I3,A)')'T ',xpin_label(end),ypin,' 9 6 1 1 0 ',align_label(end),' 1' | |
| 229 | + write(symbol_file_unit,'(A)')trim(pinlabel_string) | |
| 230 | + write(symbol_file_unit,'(A)')'T 200 200 5 8 0 0 0 2 1' | |
| 231 | + write(symbol_file_unit,'(A)')'pintype=pas' | |
| 232 | + write(symbol_file_unit,'(A)')'}' | |
| 233 | + | |
| 234 | + end if | |
| 178 | 235 | |
| 179 | 236 | ! spice_subcircuit_filename=trim(MOD_spice_bundle_lib_dir)//trim(spice_bundle_model%spice_model_name)//spice_model_file_extn |
| 180 | 237 | spice_subcircuit_filename='PATH_TO_TRANSMISSION_LINE_SUB_CIRCUITS/'// & |
| ... | ... | @@ -264,6 +321,7 @@ integer :: LT_ymax_symbol ! maximum y extent of the symbol (depends on the nu |
| 264 | 321 | |
| 265 | 322 | integer :: LT_xpin1(2),LT_xpin2(2) ! pin x coordinates for ends 1 and 2 of the transmission line symbol |
| 266 | 323 | integer :: LT_ypin ! pin y coordinate |
| 324 | +integer :: Einc_y_offset | |
| 267 | 325 | |
| 268 | 326 | integer :: xpin_label(2) ! x coordinate for conductor labels at ends 1 and 2 of the transmission line symbol |
| 269 | 327 | |
| ... | ... | @@ -299,6 +357,13 @@ character(len=line_length) :: pinlabel_string |
| 299 | 357 | n_conductors=spice_bundle_model%bundle%tot_n_conductors |
| 300 | 358 | |
| 301 | 359 | LT_ymax_symbol=LT_ymin_offset+(n_conductors-1)*LT_y_conductor_spacing+LT_ymax_offset |
| 360 | + | |
| 361 | +! add a space for the incident field nodes | |
| 362 | + Einc_y_offset=0 | |
| 363 | + if (spice_bundle_model%include_incident_field) then | |
| 364 | + Einc_y_offset=LT_y_conductor_spacing | |
| 365 | + LT_ymax_symbol=LT_ymax_symbol+Einc_y_offset | |
| 366 | + end if | |
| 302 | 367 | |
| 303 | 368 | ! end 1 pin parameters # this could maybe go with parameters in the module... |
| 304 | 369 | LT_xpin1(1)=LT_xmin_symbol-LT_x_pin_length |
| ... | ... | @@ -326,7 +391,7 @@ character(len=line_length) :: pinlabel_string |
| 326 | 391 | |
| 327 | 392 | pin=pin+1 |
| 328 | 393 | |
| 329 | - LT_ypin=LT_ymax_symbol-LT_ymax_offset-(n_conductors-conductor)*LT_y_conductor_spacing | |
| 394 | + LT_ypin=LT_ymax_symbol-LT_ymax_offset-(n_conductors-conductor)*LT_y_conductor_spacing-Einc_y_offset | |
| 330 | 395 | |
| 331 | 396 | write(symbol_file_unit,'(A,4I6)')'LINE Normal ',LT_xpin1(end),LT_ypin,LT_xpin2(end),LT_ypin |
| 332 | 397 | |
| ... | ... | @@ -334,6 +399,25 @@ character(len=line_length) :: pinlabel_string |
| 334 | 399 | |
| 335 | 400 | end do ! other cable end |
| 336 | 401 | |
| 402 | +! add pins for the incident field nodes | |
| 403 | + if (spice_bundle_model%include_incident_field) then | |
| 404 | + | |
| 405 | + end=1 | |
| 406 | + pin=pin+1 | |
| 407 | + | |
| 408 | + LT_ypin=LT_ymax_symbol-LT_ymax_offset | |
| 409 | + | |
| 410 | + write(symbol_file_unit,'(A,4I6)')'LINE Normal ',LT_xpin1(end),LT_ypin,LT_xpin2(end),LT_ypin | |
| 411 | + | |
| 412 | + end=2 | |
| 413 | + pin=pin+1 | |
| 414 | + | |
| 415 | + LT_ypin=LT_ymax_symbol-LT_ymax_offset | |
| 416 | + | |
| 417 | + write(symbol_file_unit,'(A,4I6)')'LINE Normal ',LT_xpin1(end),LT_ypin,LT_xpin2(end),LT_ypin | |
| 418 | + | |
| 419 | + end if | |
| 420 | + | |
| 337 | 421 | ! write general information |
| 338 | 422 | |
| 339 | 423 | write(symbol_file_unit,'(A,2I6,A)')'WINDOW 3 ',(LT_xmin_symbol+LT_xmax_symbol)/2,-LT_ymax_text_offset,' centre 0' |
| ... | ... | @@ -357,7 +441,7 @@ character(len=line_length) :: pinlabel_string |
| 357 | 441 | do conductor=1,n_conductors |
| 358 | 442 | |
| 359 | 443 | pin=pin+1 |
| 360 | - LT_ypin=LT_ymax_symbol-LT_ymax_offset-(n_conductors-conductor)*LT_y_conductor_spacing | |
| 444 | + LT_ypin=LT_ymax_symbol-LT_ymax_offset-(n_conductors-conductor)*LT_y_conductor_spacing-Einc_y_offset | |
| 361 | 445 | |
| 362 | 446 | if (end.eq.1) then |
| 363 | 447 | write(symbol_file_unit,'(A,2I6,A,I6)')'PIN ',LT_xpin1(end),LT_ypin,' LEFT ',LT_x_pin_length |
| ... | ... | @@ -379,6 +463,30 @@ character(len=line_length) :: pinlabel_string |
| 379 | 463 | |
| 380 | 464 | end do ! other cable end |
| 381 | 465 | |
| 466 | + if (spice_bundle_model%include_incident_field) then | |
| 467 | + | |
| 468 | + end=1 | |
| 469 | + pin=pin+1 | |
| 470 | + LT_ypin=LT_ymax_symbol-LT_ymax_offset | |
| 471 | + write(symbol_file_unit,'(A,2I6,A,I6)')'PIN ',LT_xpin1(end),LT_ypin,' LEFT ',LT_x_pin_length | |
| 472 | + pinlabel_string='PinName Einc1' | |
| 473 | + write(symbol_file_unit,'(A,A)')'PINATTR ',trim(pinlabel_string) | |
| 474 | + string1='' | |
| 475 | + CALL add_integer_to_string(string1,pin,pinnumber_string) | |
| 476 | + write(symbol_file_unit,'(A,A)')'PINATTR SpiceOrder ',trim(pinnumber_string) | |
| 477 | + | |
| 478 | + end=2 | |
| 479 | + pin=pin+1 | |
| 480 | + write(symbol_file_unit,'(A,2I6,A,I6)')'PIN ',LT_xpin1(end),LT_ypin,' RIGHT ',LT_x_pin_length | |
| 481 | + pinlabel_string='PinName Einc2' | |
| 482 | + write(symbol_file_unit,'(A,A)')'PINATTR ',trim(pinlabel_string) | |
| 483 | + string1='' | |
| 484 | + CALL add_integer_to_string(string1,pin,pinnumber_string) | |
| 485 | + write(symbol_file_unit,'(A,A)')'PINATTR SpiceOrder ',trim(pinnumber_string) | |
| 486 | + | |
| 487 | + | |
| 488 | + end if | |
| 489 | + | |
| 382 | 490 | xpin_label(1)=LT_xmin_symbol |
| 383 | 491 | xpin_label(2)=LT_xmax_symbol |
| 384 | 492 | |
| ... | ... | @@ -391,184 +499,3 @@ character(len=line_length) :: pinlabel_string |
| 391 | 499 | RETURN |
| 392 | 500 | |
| 393 | 501 | END SUBROUTINE create_spice_subcircuit_symbol_LTspice |
| 394 | -! | |
| 395 | -! NAME | |
| 396 | -! create_spice_subcircuit_symbol_Pspice | |
| 397 | -! | |
| 398 | -! AUTHORS | |
| 399 | -! Chris Smartt | |
| 400 | -! | |
| 401 | -! DESCRIPTION | |
| 402 | -! This subroutine creates a symbol for the Spice subcircuit model for the cable bundle | |
| 403 | -! to be used in schematic capture software | |
| 404 | -! | |
| 405 | -! The file formats for Gschem can be found here: http://wiki.geda-project.org/geda:file_format_spec | |
| 406 | -! | |
| 407 | -! COMMENTS | |
| 408 | -! | |
| 409 | -! | |
| 410 | -! HISTORY | |
| 411 | -! | |
| 412 | -! started 15/12/2015 CJS: STAGE_1 developments | |
| 413 | -! | |
| 414 | -! | |
| 415 | -SUBROUTINE create_spice_subcircuit_symbol_Pspice(spice_bundle_model) | |
| 416 | - | |
| 417 | -USE type_specifications | |
| 418 | -USE general_module | |
| 419 | -USE constants | |
| 420 | -USE cable_module | |
| 421 | -USE cable_bundle_module | |
| 422 | -USE spice_cable_bundle_module | |
| 423 | -USE circuit_symbol_module | |
| 424 | - | |
| 425 | -IMPLICIT NONE | |
| 426 | - | |
| 427 | -! variables passed to the subroutine | |
| 428 | - | |
| 429 | -TYPE(spice_model_specification_type),intent(IN) :: spice_bundle_model | |
| 430 | - | |
| 431 | -! local variables | |
| 432 | - | |
| 433 | -character(len=filename_length) :: filename ! filename for the symbol file | |
| 434 | -character(len=filename_length) :: spice_subcircuit_filename ! filename for the associated spice sub-circuit model | |
| 435 | - | |
| 436 | -integer :: n_conductors | |
| 437 | - | |
| 438 | -integer :: ymax_symbol ! maximum y extent of the symbol (depends on the number of conductors) | |
| 439 | - | |
| 440 | -integer :: xpin1(2),xpin2(2) ! pin x coordinates for ends 1 and 2 of the transmission line symbol | |
| 441 | -integer :: ypin ! pin y coordinate | |
| 442 | - | |
| 443 | -integer :: xpin_label(2) ! x coordinate for conductor labels at ends 1 and 2 of the transmission line symbol | |
| 444 | -integer :: align_label(2) ! alignment type for symbols | |
| 445 | - | |
| 446 | -! loop variables | |
| 447 | -integer :: pin ! pin number | |
| 448 | -integer :: end ! end number | |
| 449 | -integer :: conductor ! conductor number | |
| 450 | - | |
| 451 | -! temporary strings | |
| 452 | -character(len=line_length) :: string1 | |
| 453 | -character(len=line_length) :: string2 | |
| 454 | - | |
| 455 | -! pin label strings | |
| 456 | -character(len=line_length) :: pinnumber_string | |
| 457 | -character(len=line_length) :: pinseq_string | |
| 458 | -character(len=line_length) :: pinlabel_string | |
| 459 | - | |
| 460 | -! START | |
| 461 | - | |
| 462 | -! filename for the symbol. The directory for the symbol is read from the | |
| 463 | -! .spice_model_spec file (i.e. specified by the GUI) | |
| 464 | - | |
| 465 | - filename=trim(spice_symbol_dir)//trim(spice_bundle_model%spice_model_name)//symbol_file_extn | |
| 466 | - | |
| 467 | -! open the symbol file | |
| 468 | - | |
| 469 | - OPEN(unit=symbol_file_unit,file=filename) | |
| 470 | - | |
| 471 | - if (verbose) write(*,*)'Opened file:',trim(filename) | |
| 472 | - | |
| 473 | -! calculate the size of the symbol from the number of conductors and set all symbol dimensions | |
| 474 | - | |
| 475 | - n_conductors=spice_bundle_model%bundle%tot_n_conductors | |
| 476 | - | |
| 477 | - ymax_symbol=ymin_offset+(n_conductors-1)*y_conductor_spacing+ymax_offset | |
| 478 | - | |
| 479 | -! end 1 pin parameters # this could maybe go with parameters in the module... | |
| 480 | - xpin1(1)=xmin_symbol-x_pin_length | |
| 481 | - xpin2(1)=xmin_symbol | |
| 482 | - | |
| 483 | -! end 2 pin parameters | |
| 484 | - xpin1(2)=xmax_symbol+x_pin_length | |
| 485 | - xpin2(2)=xmax_symbol | |
| 486 | - | |
| 487 | - ! write the header | |
| 488 | - write(symbol_file_unit,'(A)')symbol_version | |
| 489 | - | |
| 490 | -! write the rectangular box | |
| 491 | - write(symbol_file_unit,'(A,4I6,A)')'L ',xmin_symbol,ymin_symbol,xmin_symbol,ymax_symbol,' 3 0 0 0 -1 -1' | |
| 492 | - write(symbol_file_unit,'(A,4I6,A)')'L ',xmin_symbol,ymax_symbol,xmax_symbol,ymax_symbol,' 3 0 0 0 -1 -1' | |
| 493 | - write(symbol_file_unit,'(A,4I6,A)')'L ',xmax_symbol,ymax_symbol,xmax_symbol,ymin_symbol,' 3 0 0 0 -1 -1' | |
| 494 | - write(symbol_file_unit,'(A,4I6,A)')'L ',xmax_symbol,ymin_symbol,xmin_symbol,ymin_symbol,' 3 0 0 0 -1 -1' | |
| 495 | - | |
| 496 | -! write the connection pins | |
| 497 | - xpin_label(1)=xmin_symbol | |
| 498 | - xpin_label(2)=xmax_symbol | |
| 499 | - align_label(1)=1 ! left | |
| 500 | - align_label(2)=7 ! right | |
| 501 | - | |
| 502 | - pin=0 | |
| 503 | - do end=1,2 | |
| 504 | - | |
| 505 | - do conductor=1,n_conductors | |
| 506 | - | |
| 507 | - pin=pin+1 | |
| 508 | - ypin=ymax_symbol-ymax_offset-(conductor-1)*y_conductor_spacing | |
| 509 | - | |
| 510 | - string1='pinnumber=' | |
| 511 | - CALL add_integer_to_string(string1,pin,pinnumber_string) | |
| 512 | - | |
| 513 | - string1='pinseq=' | |
| 514 | - CALL add_integer_to_string(string1,pin,pinseq_string) | |
| 515 | - | |
| 516 | - string1='pinlabel=c_' | |
| 517 | - CALL add_integer_to_string(string1,conductor,string2) | |
| 518 | - string1=trim(string2)//'_e_' | |
| 519 | - CALL add_integer_to_string(string1,end,pinlabel_string) | |
| 520 | - | |
| 521 | - write(symbol_file_unit,'(A,4I6,A)')'P ',xpin1(end),ypin,xpin2(end),ypin,' 1 0 0' | |
| 522 | - write(symbol_file_unit,'(A)')'{' | |
| 523 | - write(symbol_file_unit,'(A)')'T 150 250 5 8 0 0 0 6 1' | |
| 524 | - write(symbol_file_unit,'(A)')trim(pinnumber_string) | |
| 525 | - write(symbol_file_unit,'(A)')'T 150 150 5 8 0 0 0 8 1' | |
| 526 | - write(symbol_file_unit,'(A)')trim(pinseq_string) | |
| 527 | - write(symbol_file_unit,'(A,2I6,A,I3,A)')'T ',xpin_label(end),ypin,' 9 6 1 1 0 ',align_label(end),' 1' | |
| 528 | - write(symbol_file_unit,'(A)')trim(pinlabel_string) | |
| 529 | - write(symbol_file_unit,'(A)')'T 200 200 5 8 0 0 0 2 1' | |
| 530 | - write(symbol_file_unit,'(A)')'pintype=pas' | |
| 531 | - write(symbol_file_unit,'(A)')'}' | |
| 532 | - | |
| 533 | - end do ! next conductor | |
| 534 | - | |
| 535 | - end do ! other cable end | |
| 536 | - | |
| 537 | -! spice_subcircuit_filename=trim(MOD_spice_bundle_lib_dir)//trim(spice_bundle_model%spice_model_name)//spice_model_file_extn | |
| 538 | - spice_subcircuit_filename='PATH_TO_TRANSMISSION_LINE_SUB_CIRCUITS/'// & | |
| 539 | - trim(spice_bundle_model%spice_model_name)//spice_model_file_extn | |
| 540 | - | |
| 541 | -! write the general circuit symbol information | |
| 542 | - write(symbol_file_unit,'(A,2I6,A)')'T ',(xmin_symbol+xmax_symbol)/2,ymax_symbol+2*ymax_text_offset,' 8 10 1 1 0 4 1' | |
| 543 | - string1='device='//trim(spice_bundle_model%spice_model_name) | |
| 544 | - write(symbol_file_unit,'(A)')trim(string1) | |
| 545 | - | |
| 546 | - write(symbol_file_unit,'(A,2I6,A)')'T ',(xmin_symbol+xmax_symbol)/2,ymax_symbol+ymax_text_offset,' 5 10 1 0 0 4 1' | |
| 547 | - write(symbol_file_unit,'(A)')'refdes=X?' | |
| 548 | - | |
| 549 | - write(symbol_file_unit,'(A,2I6,A)')'T ',xmin_symbol,ymin_symbol,' 8 10 0 0 0 4 1' | |
| 550 | - string1='description='//trim(spice_bundle_model%spice_model_name) | |
| 551 | - write(symbol_file_unit,'(A)')trim(string1) | |
| 552 | - | |
| 553 | - write(symbol_file_unit,'(A,2I6,A)')'T ',xmin_symbol,ymin_symbol,' 8 10 0 0 0 0 1' | |
| 554 | - string1='value='//trim(spice_bundle_model%spice_model_name) | |
| 555 | - write(symbol_file_unit,'(A)')trim(string1) | |
| 556 | - | |
| 557 | - write(symbol_file_unit,'(A,2I6,A)')'T ',xmin_symbol,ymin_symbol,' 8 10 0 0 0 0 1' | |
| 558 | - write(symbol_file_unit,'(A,A)')'file=',trim(spice_subcircuit_filename) | |
| 559 | - | |
| 560 | - write(symbol_file_unit,'(A,2I6,A)')'T ',xmin_symbol,ymin_symbol,' 8 10 0 0 0 0 1' | |
| 561 | - write(symbol_file_unit,'(A)')'numslots=0' | |
| 562 | - | |
| 563 | - write(symbol_file_unit,'(A,2I6,A)')'T ',xmin_symbol,ymin_symbol,' 8 10 0 0 0 0 1' | |
| 564 | - write(symbol_file_unit,'(A)')'symversion=0.1' | |
| 565 | - | |
| 566 | -! close the symbol file | |
| 567 | - | |
| 568 | - CLOSE(unit=symbol_file_unit) | |
| 569 | - | |
| 570 | - if (verbose) write(*,*)'Closed file:',trim(filename) | |
| 571 | - | |
| 572 | - RETURN | |
| 573 | - | |
| 574 | -END SUBROUTINE create_spice_subcircuit_symbol_Pspice | ... | ... |