/*******************************************************************************
* See the NOTICE file distributed with this work for additional information
* regarding copyright ownership.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
******************************************************************************/
package hr.fer.zemris.vhdllab.service.extractor.automaton;
import hr.fer.zemris.vhdllab.applets.editor.automaton.AUTParser;
import hr.fer.zemris.vhdllab.applets.editor.automaton.AUTPodatci;
import hr.fer.zemris.vhdllab.applets.editor.automaton.Prijelaz;
import hr.fer.zemris.vhdllab.applets.editor.automaton.Stanje;
import hr.fer.zemris.vhdllab.entity.File;
import hr.fer.zemris.vhdllab.entity.FileType;
import hr.fer.zemris.vhdllab.service.ci.CircuitInterface;
import hr.fer.zemris.vhdllab.service.exception.CircuitInterfaceExtractionException;
import hr.fer.zemris.vhdllab.service.exception.DependencyExtractionException;
import hr.fer.zemris.vhdllab.service.exception.VhdlGenerationException;
import hr.fer.zemris.vhdllab.service.extractor.AbstractMetadataExtractor;
import hr.fer.zemris.vhdllab.service.result.Result;
import java.io.IOException;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
import org.apache.commons.lang.NotImplementedException;
import org.xml.sax.SAXException;
public class AutomatonMetadataExtractor extends AbstractMetadataExtractor {
@Override
public CircuitInterface extractCircuitInterface(File file)
throws CircuitInterfaceExtractionException {
AUTParser aut = new AUTParser();
try {
aut.AUTParse(file.getData());
} catch (IOException e) {
throw new CircuitInterfaceExtractionException(e);
} catch (SAXException e) {
throw new CircuitInterfaceExtractionException(e);
}
AUTPodatci podatci = aut.podatci;
StringBuffer buffer = new StringBuffer();
buffer.append("library IEEE;\nuse IEEE.STD_LOGIC_1164.ALL;\n\n");
buffer = addEntity(buffer, podatci);
buffer.append("\nARCHITECTURE Behavioral OF ").append(podatci.ime)
.append(" IS\nBEGIN\nEND Behavioral;");
String VHDL = buffer.toString();
File source = new File(file.getName(), FileType.SOURCE, VHDL);
return metadataExtractor.extractCircuitInterface(source);
}
private StringBuffer addEntity(StringBuffer buffer, AUTPodatci podatci) {
buffer.append("ENTITY ").append(podatci.ime).append(" IS PORT(\n")
.append("\tclock: IN std_logic;\n\treset: IN std_logic;");
String[] redovi = podatci.interfac.split("\n");
for (int i = 0; i < redovi.length; i++) {
buffer.append("\n\t");
String[] rijeci = redovi[i].split(" ");
buffer.append(rijeci[0]).append(": ").append(
rijeci[1].toUpperCase()).append(" ").append(rijeci[2]);
if (rijeci[2].toUpperCase().equals("STD_LOGIC_VECTOR")) {
if (Integer.parseInt(rijeci[3]) < Integer.parseInt(rijeci[4]))
buffer.append("(").append(Integer.parseInt(rijeci[3]))
.append(" TO ").append(Integer.parseInt(rijeci[4]))
.append(")");
else
buffer.append("(").append(Integer.parseInt(rijeci[3]))
.append(" DOWNTO ").append(
Integer.parseInt(rijeci[4])).append(")");
}
buffer.append(";");
}
buffer.deleteCharAt(buffer.length() - 1);
buffer.append(");\nEND ").append(podatci.ime).append(";\n");
return buffer;
}
@Override
protected CircuitInterface doExtractCircuitInterface(String data)
throws CircuitInterfaceExtractionException {
throw new NotImplementedException();
}
@Override
protected Set<String> doExtractDependencies(String data)
throws DependencyExtractionException {
return Collections.emptySet();
}
@Override
protected Result doGenerateVhdl(String data) throws VhdlGenerationException {
AUTParser aut = new AUTParser();
try {
aut.AUTParse(data);
} catch (Exception e) {
throw new VhdlGenerationException(e.getMessage());
}
LinkedList<Stanje> stanja = aut.stanja;
HashSet<Prijelaz> prijelazi = aut.prijelazi;
AUTPodatci podatci = aut.podatci;
String parsedVHDL;
if (provjera(stanja, podatci)) {
IAutomatVHDLGenerator inter = null;
if (podatci.tip.toUpperCase().equals("MOORE"))
inter = new MooreParser(stanja, podatci, prijelazi);
else
inter = new MealyParser(stanja, podatci, prijelazi);
parsedVHDL = inter.getData();
} else {
List<String> messages = Arrays.asList("Nije moguce generirat VHDL ukoliko pocetno stanje nije postavljeno");
return new Result(messages);
}
return new Result(parsedVHDL);
}
private boolean provjera(LinkedList<Stanje> stanja, AUTPodatci podatci) {
if (stanja.size() == 0 || podatci.pocetnoStanje.equals(""))
return false;
return true;
}
}