• Skip to main content
  • Skip to search
  • Skip to footer
Cadence Home
  • This search text may be transcribed, used, stored, or accessed by our third-party service providers per our Cookie Policy and Privacy Policy.

  1. Community Forums
  2. Custom IC SKILL
  3. Running perl from skill and getting output one at a tim...

Stats

  • Locked Locked
  • Replies 12
  • Subscribers 144
  • Views 19827
  • Members are here 0
This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Running perl from skill and getting output one at a time

Pawandeep
Pawandeep over 13 years ago

Hi

I would like to run a perl program from my Allegro PCB Skill code.

I have skill code like below
procedure(test()
        cid=ipcBeginProcess("perl C:/test.pl")
        ipcReadProcess(cid 5)
)

The perl program(test.pl) is reading data/values from text files containing multiple lines and printing out values using foreach loop(till EOF)

I would like to have some kind of blocking method to pass the values to skill code one at a time(and then returning to perl to run next) so as to manupulate in skill.

  • Cancel
  • Andrew Beckett
    Andrew Beckett over 13 years ago

    You could just use parseString() on the result of ipcReadProcess - e.g. parseString(ipcReadProcess(cid 5) "\n") to split the strings on the carriage return. Other than that you'll have to create some kind of handshaking protocol between the two - and make sure you flush the output in perl after writing each line. By handshaking I mean you'd have to read a line in SKILL, and then send a message back using ipcWriteProcess, and have your perl script wait until it gets the message back before writing the next string. 

    It's not that clear what you really want to do here or why it needs to do this one at a time. In fact if you only want to read the file and print it out, just doing printf("%s" ipcReadProcess(cid 5)) would be sufficient. So you could do:

    procedure(test()
      cid=ipcBeginProcess("perl C:/test.pl")
      ipcWaitForProcess(cid)
      while(ipcIsAliveProcess(cid)
        printf("%s" ipcReadProcess(cid 5))
      )
    )

    BTW - not sure why you posted this in the Custom IC SKILL forum if  you're using Allegro SKILL - there's a PCB SKILL forum which would be more appropriate. However, the code above should work in both Virtuoso and Allegro environments, I believe.

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Pawandeep
    Pawandeep over 13 years ago
    Hello Andrew,
     
    I am looking for some kind of handshaking protocol as you have mentioned, but parseString will not be suitable to handle large data.
     
    The reason for passing values one at time is to have a method to store the values in some variable in skill(and further do manupulations in skill) and then return to perl to get the next value.
     
    The reason for posting here was that I saw some post from this forum in the past but was not able to find any relevant material and most of them from you :-)
     
    In anyways, I will try to look in to ipcWriteProcess as you have mentioned.
     
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Heywire
    Heywire over 11 years ago

    Hi Andrew,

    I am trying to run a perl script in skill through CIW. I am using ipcBeginProcess("perl filename.pl").Please post  the procedure to execute  the perl script in skill and see the results.

    Thanks,

    Anand 

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 11 years ago

    Hi Anand,

    Normally perl scripts have buffered output, which tends to mean that you wouldn't see any output until perl's output buffer fills up (1024 chars, I think). So I used this example "nobuf.pl" to illustrate how to change that:

    $|=1;
    print "now you see it...";
    sleep 10;
    print "now you don't...";

    The  "$|" bit is the key to making the output unbuffered.

    procedure(CCFprintOutput(cid data)
      printf("RECEIVED at %s: %s\n" getCurrentTime() data)
    )

    procedure(CCFprogramFinished(cid status)
      printf("FINISHED at %s with exit status %d\n" getCurrentTime() status)
    )

    ipcBeginProcess("perl nobuf.pl" "" 'CCFprintOutput 'CCFprintOutput 'CCFprogramFinished)

    From which I got:

    RECEIVED at Apr 26 20:12:12 2014: now you see it...
    RECEIVED at Apr 26 20:12:22 2014: now you don't...
    FINISHED at Apr 26 20:12:22 2014 with exit status 0

    If I had run the command for "buf.pl" which is identical except for omitting the first line (the $| statement), I got  a 10 second delay and then:

    RECEIVED at Apr 26 20:15:11 2014: now you see it...now you don't...
    FINISHED at Apr 26 20:15:11 2014 with exit status 0

    Of course, this example is showing asynchronous communication. It's also possible to just do:

    ipcId=ipcBeginProcess("perl nobuf.pl")
    ipcWaitForProcess(ipcId)
    ipcReadProcess(ipcId 30) =>"now you see it..."
    ipcReadProcess(ipcId 30) => "now you don't..."  (after a delay)
    ipcIsAliveProcess(ipcId) => nil

    If you want synchronous communication. The 30 is a timeout in case the child process doesn't respond.

    Hope that helps!

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Heywire
    Heywire over 11 years ago

    Hi Andrew,

    It's  been great help. Thanks a lot.

    Best Regards,

    Anand 

     

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Heywire
    Heywire over 11 years ago

     Hi Andrew,

    I wanted write skill program(in Virtuoso CIW) and call perl code using ipc process. I want to pass argument/variables from skill domain to the perl code.Please enlighten me regarding the steps and methodolgy.By the way, how can I create an excel/spreadsheet file and write it, in skill? 

    Thanks and best regards,

    Anand 

     

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • skillUser
    skillUser over 11 years ago

    Hi Anand,

    Where the Perl program is invoked in the ipcBeginProcess statement (as in the earlier example in this thread), you can use the sprintf function to build the command line for the Perl program up, inserting any SKILL variable values where needed.  As an example, you might do something like this:

    ;; pass the SKILL variables skillStringVar, skNum1 and skNum2 as command line arguments to the Perl program
    cmd = sprintf("perlProg %s %d %d" skillStringVar skNum1 skNum2)
    ipcBeginProcess(cmd ...)
    

    Hopefully this answers your question and helps you?

    regards,

    Lawrence.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • ebecheto
    ebecheto over 9 years ago

    I think you forgot the `nil' argument to the sprintf function

    skillStringVar="tata"
    skNum1=1
    skNum2=2
    cmd = sprintf(nil "perlProg %s %d %d" skillStringVar skNum1 skNum2)
    cmd;=> "perlProg tata 1 2"
    

    Regards,

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • anandmohan
    anandmohan over 8 years ago
    HI Andrew,

    Is there any way to execute a skill code from a perl program

    Regards
    Anand Mohan
    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
  • Andrew Beckett
    Andrew Beckett over 8 years ago

    Anand,

    First of all, the forum guidelines ask you not to post on the end of an old thread - this is actually a thread which is asking about the opposite of what you want. It muddies the water for anyone who searches for related topics.

    Secondly, does this post help? It's showing how to implement a socket in Virtuoso that you could then talk to from an external Tcl (or perl, or Python) program.

    Regards,

    Andrew.

    • Cancel
    • Vote Up 0 Vote Down
    • Cancel
>

Community Guidelines

The Cadence Design Communities support Cadence users and technologists interacting to exchange ideas, news, technical information, and best practices to solve problems and get the most from Cadence technology. The community is open to everyone, and to provide the most value, we require participants to follow our Community Guidelines that facilitate a quality exchange of ideas and information. By accessing, contributing, using or downloading any materials from the site, you agree to be bound by the full Community Guidelines.

© 2025 Cadence Design Systems, Inc. All Rights Reserved.

  • Terms of Use
  • Privacy
  • Cookie Policy
  • US Trademarks
  • Do Not Sell or Share My Personal Information