Subscribe Bookmark RSS Feed

How to select patterns based on segments of strings

mhafiz

New Contributor

Joined:

Jan 20, 2017

Hi,

I'm a new user of JSL. In order to group a large number of  pins and adding a new columns for those groups, I'm thinking to use JSL. I got to know how to do that for first consecutive characters (e.g. for DDR0CH0CKN... I know how to filter it using DDR0...) but if I'm to do that using segments like 'DDR0' and 'CK', what would be an efficient way to do that? 

 

FYI: One way, I know, is to use a manually created file and then use update command to match pins to pin groups (not an efficient way). I tried patMatch/regex etc. but could not get the desired result.

 

For your convenience, I've attached .jmp file where I want to have a column called "Desired_Pin_Group" for the pins.

 

I appreciate your cooperation.

 

Regards,

 

Hafiz.

1 ACCEPTED SOLUTION

Accepted Solutions
txnelson

Super User

Joined:

Jun 22, 2012

Solution

Here is a script that will do what you want, given the example you gave.  If you have a lot more pin combinations that require exception processing this may not be the best way to handle this.

Names Default To Here( 1 );
dt = Current Data Table();
dt << New Column( "Generated Pin Group", character );

For Each Row(
// Get the first part of the group name
	First = Lowercase( Substr( :Pin, 1, 4 ) );

// Handle exceptions like the below case
	If( First == "ddrr",
		First = "ddr0"
	);

// Now attach the "_"
	First = First || "_";

// Now add the second part based upon the given complexities

	// Handle the clk
	If(
		Contains( :Pin, "_CK" ) > 0 & Contains( :Pin, "_CKE" ) == 0, First = First || "clk", 
	// Handle the vref
		Contains( :Pin, "_VREF" ) > 0, First = First || "vref", 
	// Handle the cke
		Contains( :Pin, "_CKE" ) > 0, First = First || "cke", 
	// Handle the reset
		Contains( :Pin, "RESET" ) > 0, First = First || "Reset"
	);
	:Generated Pin Group = First;
);

If you want to do this as a formula for a column, it is just a simple change

First = Lowercase( Substr( :Pin, 1, 4 ) );
If( First == "ddrr",
	First = "ddr0"
);
First = First || "_";
If(
	Contains( :Pin, "_CK" ) > 0 & Contains( :Pin, "_CKE" ) == 0,
		First = First || "clk",
	Contains( :Pin, "_VREF" ) > 0, First = First || "vref",
	Contains( :Pin, "_CKE" ) > 0, First = First || "cke",
	Contains( :Pin, "RESET" ) > 0, First = First || "Reset"
);
First;
Jim
5 REPLIES
txnelson

Super User

Joined:

Jun 22, 2012

Solution

Here is a script that will do what you want, given the example you gave.  If you have a lot more pin combinations that require exception processing this may not be the best way to handle this.

Names Default To Here( 1 );
dt = Current Data Table();
dt << New Column( "Generated Pin Group", character );

For Each Row(
// Get the first part of the group name
	First = Lowercase( Substr( :Pin, 1, 4 ) );

// Handle exceptions like the below case
	If( First == "ddrr",
		First = "ddr0"
	);

// Now attach the "_"
	First = First || "_";

// Now add the second part based upon the given complexities

	// Handle the clk
	If(
		Contains( :Pin, "_CK" ) > 0 & Contains( :Pin, "_CKE" ) == 0, First = First || "clk", 
	// Handle the vref
		Contains( :Pin, "_VREF" ) > 0, First = First || "vref", 
	// Handle the cke
		Contains( :Pin, "_CKE" ) > 0, First = First || "cke", 
	// Handle the reset
		Contains( :Pin, "RESET" ) > 0, First = First || "Reset"
	);
	:Generated Pin Group = First;
);

If you want to do this as a formula for a column, it is just a simple change

First = Lowercase( Substr( :Pin, 1, 4 ) );
If( First == "ddrr",
	First = "ddr0"
);
First = First || "_";
If(
	Contains( :Pin, "_CK" ) > 0 & Contains( :Pin, "_CKE" ) == 0,
		First = First || "clk",
	Contains( :Pin, "_VREF" ) > 0, First = First || "vref",
	Contains( :Pin, "_CKE" ) > 0, First = First || "cke",
	Contains( :Pin, "RESET" ) > 0, First = First || "Reset"
);
First;
Jim
mhafiz

New Contributor

Joined:

Jan 20, 2017

Thanks for your quick response. The script is quite ok for the .jmp file that I gave previously. But, unfortunately it's not that straightforward. The number of pins is in the range of 150-200 and those are grouped within 15-20 groups. Please have a look at the newly attached .jmp file, it's closer to the real scenario. Just have a look from 22-27 and 81-83. Those 2 groups have DDR_Y in common, but they are filtered based on other phrases within the string. The logic is something like: if :Pin=='DDR_Y' && Pin != NC :Desired_Pin_Group=ddr_dq_ch0 else :Desired_Pin_Group=ddr_ctrl. The distinguishing criteria between the groups (81-83) and (93-96) are even more complex. One needs to search the last phrases.

 

Your cooperation is highly appreciated.

 

Hafiz.

markbailey

Staff

Joined:

Jun 23, 2011

JMP provides an entire pattern matching suite of functions and constructs that you might find useful here. See Help > Books > Scripting Guide. Then search for this section in the book.

mhafiz

New Contributor

Joined:

Jan 20, 2017

Hi txnelson,

 

I used the concept of the conditional statement that you provided and could solve my issue. Rather than converting to lowercase, I added a new column in the table and put the pin name directly using parenthesis, as:

 

dt <<New Column("Match_Pin_Grp", Character, Nominal,
Formula(
If(Contains(:Pin, "_CK")>0 & Contains(:Pin,"DDR0") & Contains(:Pin, "_CKE")==0,"ddr0_clk",
Contains(:Pin, "_CK")>0 & Contains(:Pin,"DDR1") & Contains(:Pin, "_CKE")==0,"ddr1_clk",

 

However, I'm accepting it as a solution to the problem.

Thanks for your help.

 

Regards,

Hafiz.

txnelson

Super User

Joined:

Jun 22, 2012

Hafiz,

I am happy that I have been able to help you solve your problem.

Jim