#!/usr/bin/env python

############################### blif_splicer.py ################################
#
# Generate the k largest circuits (by total # of logic blocks or occurrences
# of '.names') which can be formed by concatenating n of the MCNC 20 circuits.
# Gives an error for circuits with multiple .model sections.
#
# Author: Michael Wainberg

################################### Settings ###################################

k = 10
n = 2
blifdir = "../benchmarks/blif"

################################################################################

import os
import sys
import glob
import itertools

os.chdir(blifdir)

# Get the name of each circuit (without the '.blif') and its # of logic blocks

circuits = []
for filename in glob.glob('*.blif'):
	if '+' in filename: 
		continue # don't use outputs from previous script runs as inputs
	with open(filename) as infile:
		name = os.path.splitext(filename)[0] # remove '.blif'
		circuits.append((name, infile.read().count('.names')))

# Iterate over the first k combinations of n circuits in decreasing order,
# sorted by the total number of logic blocks, and stitch them together.
# Note: this could be optimized further by storing the processed version
# of each circuit after it is read in for the first time, since the largest 
# circuits will likely be reused often. 

nonNetChars = '0123456789\\-\n' # a valid net name can't use only these

for tupleIndex, nTuple in enumerate(sorted(itertools.combinations(circuits, n), 
	key=lambda item: sum(circuit[1] for circuit in item), reverse=True)):
	
	# Parse each input blif into the following strings, which represent
	# different sections of the output file.

	sections = ['.inputs ', '.outputs ', ''] 

	for circuitIndex, circuit in enumerate(nTuple):
		name = circuit[0]
		sectionNumber = 0 # 0 = .inputs, 1 = .outputs, 2 = body
		modelFlag = False
		with open(name + '.blif') as infile:
			# After each circuit, replace the last newline of .inputs and 
			# .outputs lines with a line continuation '\' then a newline.
			if circuitIndex > 0:
				sections[0] = sections[0][:-1] + ' \\\n'
				sections[1] = sections[1][:-1] + ' \\\n'
			for line in infile:
				if not line or line[0] == '\n':
					continue # empty line
				if line[0] == '.':
					if line[1] == 'm': # .model
						if modelFlag:
							sys.exit('Multiple .model sections in circuit ' +
								name + ': aborting')
						modelFlag = True
						continue
					if line[1] == 'e': # .end
						continue 
					split = line.split(' ', 1)
					if line[1] == 'o': # .outputs
						sectionNumber = 1 
					elif line[1] != 'i': # .inputs
						sectionNumber = 2
						sections[2] += split[0] + ' ' # copy 1st word 
					line = split[1] # skip 1st word

				# Add this line to the appropriate section, after mangling 
				# each net name (one which does not contain only nonNetChars
				# and is not 're') with the name of the circuit.
 
				sections[sectionNumber] += ' '.join(name + '_' + word if word 
					!= 're' and any(char not in nonNetChars for char in word)
					else word for word in line.split(' '))

	# Write the concatenation of all sections to the output file.
	# The format of the output filename is 'file1+file2+...+fileN.blif'

	filename = '+'.join(circuit[0] for circuit in nTuple) + '.blif'
	with open(filename, 'wb') as outfile:			
		outfile.write('.model top\n' + ''.join(sections) + '.end\n')
	print 'Created ' + filename + '...'

	if tupleIndex == k-1: 
		break
