mirror of
				https://github.com/YosysHQ/yosys
				synced 2025-10-31 03:32:29 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			108 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
			
		
		
	
	
			108 lines
		
	
	
	
		
			2.6 KiB
		
	
	
	
		
			Perl
		
	
	
	
	
	
| #!/usr/bin/perl -w
 | |
| 
 | |
| use strict;
 | |
| 
 | |
| # let "macc" implement a function like Y = (A*B) + (C*D)
 | |
| #
 | |
| # the following permutations of the input pins exist:
 | |
| #
 | |
| #   g01 | A B C D |  match
 | |
| #   g02 | A B D C |  match
 | |
| #   g03 | A C B D |  not
 | |
| #   g04 | A C D B |  not
 | |
| #   g05 | A D B C |  not
 | |
| #   g06 | A D C B |  not
 | |
| #   g07 | B A C D |  match
 | |
| #   g08 | B A D C |  match
 | |
| #   g09 | B C A D |  not
 | |
| #   g10 | B C D A |  not
 | |
| #   g11 | B D A C |  not
 | |
| #   g12 | B D C A |  not
 | |
| #   g13 | C A B D |  not
 | |
| #   g14 | C A D B |  not
 | |
| #   g15 | C B A D |  not
 | |
| #   g16 | C B D A |  not
 | |
| #   g17 | C D A B |  match
 | |
| #   g18 | C D B A |  match
 | |
| #   g19 | D A B C |  not
 | |
| #   g20 | D A C B |  not
 | |
| #   g21 | D B A C |  not
 | |
| #   g22 | D B C A |  not
 | |
| #   g23 | D C A B |  match
 | |
| #   g24 | D C B A |  match
 | |
| 
 | |
| my @matches = qw/g01 g02 g07 g08 g17 g18 g23 g24/;
 | |
| my @non_matches = qw/g03 g04 g05 g06 g09 g10 g11 g12 g13 g14 g15 g16 g19 g20 g21 g22/;
 | |
| 
 | |
| print "\n";
 | |
| 
 | |
| for my $i (0..3) {
 | |
| for my $j (0..2) {
 | |
| for my $k (0..1) {
 | |
| 	my @t = qw/A B C D/;
 | |
| 	print "# ";
 | |
| 	print splice(@t,$i,1),splice(@t,$j,1),splice(@t,$k,1),$t[0];
 | |
| 	print "\n";
 | |
| }}}
 | |
| 
 | |
| print "\n";
 | |
| 
 | |
| my $iter = 1;
 | |
| for my $i (0..3) {
 | |
| for my $j (0..2) {
 | |
| for my $k (0..1) {
 | |
| 	my @t = qw/A B C D/;
 | |
| 	printf "graph g%02d\n", $iter++;
 | |
| 	printf "  node input input A 32 1 B 32 1 C 32 1 D 32 1\n";
 | |
| 	printf "  node macc  macc  A 32 1 B 32 1 C 32 1 D 32 1\n";
 | |
| 	printf "  connect input A macc %s\n", splice(@t,$i,1);
 | |
| 	printf "  connect input B macc %s\n", splice(@t,$j,1);
 | |
| 	printf "  connect input C macc %s\n", splice(@t,$k,1);
 | |
| 	printf "  connect input D macc %s\n", splice(@t,0,1);
 | |
| 	printf "endgraph\n";
 | |
| 	printf "\n";
 | |
| }}}
 | |
| 
 | |
| $iter = 1;
 | |
| printf "graph gXL\n";
 | |
| for my $i (0..3) {
 | |
| for my $j (0..2) {
 | |
| for my $k (0..1) {
 | |
| 	my $id = sprintf "_%02d", $iter++;
 | |
| 	my @t = qw/A B C D/;
 | |
| 	printf "  node input$id input A 16 B 16 C 16 D 16\n";
 | |
| 	printf "  node macc$id  macc  A 16 B 16 C 16 D 16\n";
 | |
| 	printf "  connect input$id A macc$id %s\n", splice(@t,$i,1);
 | |
| 	printf "  connect input$id B macc$id %s\n", splice(@t,$j,1);
 | |
| 	printf "  connect input$id C macc$id %s\n", splice(@t,$k,1);
 | |
| 	printf "  connect input$id D macc$id %s\n", splice(@t,0,1);
 | |
| }}}
 | |
| printf "endgraph\n";
 | |
| printf "\n";
 | |
| 
 | |
| 
 | |
| printf "swapgroup macc A B\n";
 | |
| printf "swapgroup macc C D\n";
 | |
| printf "swapperm macc A B C D : C D A B\n";
 | |
| 
 | |
| for my $i (@matches) {
 | |
| for my $j (@non_matches) {
 | |
| 	printf "solve %s %s\n", $i, $j;
 | |
| }}
 | |
| printf "expect 0\n\n";
 | |
| 
 | |
| for my $i (@matches) {
 | |
| for my $j (@matches) {
 | |
| 	printf "solve %s %s\n", $i, $j;
 | |
| }}
 | |
| printf "expect %d\n\n", @matches*@matches;
 | |
| 
 | |
| printf "solve g01 gXL false\n";
 | |
| printf "expect 8\n";
 | |
| 
 | |
| printf "solve g03 gXL false\n";
 | |
| printf "expect 8\n";
 | |
| 
 | |
| printf "solve g04 gXL false\n";
 | |
| printf "expect 8\n";
 | |
| 
 |