package com.minres.rdl.generator; import com.google.common.base.Objects; import com.minres.rdl.RdlUtil; import com.minres.rdl.rdl.ComponentDefinition; import com.minres.rdl.rdl.ComponentDefinitionType; import com.minres.rdl.rdl.Instantiation; import java.util.Iterator; import org.eclipse.emf.common.notify.Notifier; import org.eclipse.xtend2.lib.StringConcatenation; import org.eclipse.xtext.xbase.lib.Functions.Function1; import org.eclipse.xtext.xbase.lib.IterableExtensions; import org.eclipse.xtext.xbase.lib.IteratorExtensions; @SuppressWarnings("all") public class ModuleGenerator extends RdlBaseGenerator { private final ComponentDefinition componentDefinition; public ModuleGenerator(final ComponentDefinition definition) { this.componentDefinition = definition; } @Override public boolean getOverwrite() { return false; } @Override public String generateHeader(final String namespace) { String _xblockexpression = null; { ComponentDefinitionType _type = this.componentDefinition.getType(); boolean _notEquals = (!Objects.equal(_type, ComponentDefinitionType.REGFILE)); if (_notEquals) { return ""; } final Function1 _function = (Notifier it) -> { return Boolean.valueOf((it instanceof ComponentDefinition)); }; final Function1 _function_1 = (Notifier it) -> { return ((ComponentDefinition) it); }; final Function1 _function_2 = (ComponentDefinition it) -> { ComponentDefinitionType _type_1 = it.getType(); return Boolean.valueOf(Objects.equal(_type_1, ComponentDefinitionType.ADDRMAP)); }; final Function1 _function_3 = (ComponentDefinition def) -> { final Function1 _function_4 = (Instantiation it) -> { ComponentDefinition _componentRef = it.getComponentRef(); return Boolean.valueOf(Objects.equal(_componentRef, this.componentDefinition)); }; int _size = IterableExtensions.size(IterableExtensions.filter(def.getInstantiations(), _function_4)); return Boolean.valueOf((_size > 0)); }; final Iterator addrMaps = IteratorExtensions.filter(IteratorExtensions.filter(IteratorExtensions.map(IteratorExtensions.filter(this.componentDefinition.eResource().getResourceSet().getAllContents(), _function), _function_1), _function_2), _function_3); int _size = IteratorExtensions.size(addrMaps); boolean _equals = (_size == 0); if (_equals) { return ""; } StringConcatenation _builder = new StringConcatenation(); _builder.append("#ifndef _"); String _upperCase = namespace.toUpperCase(); _builder.append(_upperCase); _builder.append("_"); String _upperCase_1 = RdlUtil.effectiveName(this.componentDefinition).toUpperCase(); _builder.append(_upperCase_1); _builder.append("_H_"); _builder.newLineIfNotEmpty(); _builder.append("#define _"); String _upperCase_2 = namespace.toUpperCase(); _builder.append(_upperCase_2); _builder.append("_"); String _upperCase_3 = RdlUtil.effectiveName(this.componentDefinition).toUpperCase(); _builder.append(_upperCase_3); _builder.append("_H_"); _builder.newLineIfNotEmpty(); _builder.append("#include "); _builder.newLine(); _builder.newLine(); _builder.append("namespace "); _builder.append(namespace); _builder.append(" {"); _builder.newLineIfNotEmpty(); _builder.append("namespace gen {"); _builder.newLine(); _builder.append("class "); String _effectiveName = RdlUtil.effectiveName(this.componentDefinition); _builder.append(_effectiveName); _builder.append("_regs;"); _builder.newLineIfNotEmpty(); _builder.append("}"); _builder.newLine(); _builder.newLine(); _builder.append("class "); String _effectiveName_1 = RdlUtil.effectiveName(this.componentDefinition); _builder.append(_effectiveName_1); _builder.append(" : public sc_core::sc_module, public scc::tlm_target<> {"); _builder.newLineIfNotEmpty(); _builder.append("public:"); _builder.newLine(); _builder.append(" "); _builder.append("sc_core::sc_in clk_i{\"clk_i\"};"); _builder.newLine(); _builder.append(" "); _builder.append("sc_core::sc_in rst_i{\"rst_i\"};"); _builder.newLine(); _builder.append(" "); String _effectiveName_2 = RdlUtil.effectiveName(this.componentDefinition); _builder.append(_effectiveName_2, " "); _builder.append("(sc_core::sc_module_name nm);"); _builder.newLineIfNotEmpty(); _builder.append(" "); _builder.append("virtual ~"); String _effectiveName_3 = RdlUtil.effectiveName(this.componentDefinition); _builder.append(_effectiveName_3, " "); _builder.append("() override;"); _builder.newLineIfNotEmpty(); _builder.newLine(); _builder.append("protected:"); _builder.newLine(); _builder.append(" "); _builder.append("void clock_cb();"); _builder.newLine(); _builder.append(" "); _builder.append("void reset_cb();"); _builder.newLine(); _builder.append(" "); _builder.append("sc_core::sc_time clk;"); _builder.newLine(); _builder.append(" "); _builder.append("std::unique_ptr regs;"); _builder.newLineIfNotEmpty(); _builder.append("};"); _builder.newLine(); _builder.newLine(); _builder.append("} /* namespace "); _builder.append(namespace); _builder.append(" */"); _builder.newLineIfNotEmpty(); _builder.newLine(); _builder.append("#endif /* _"); String _upperCase_4 = namespace.toUpperCase(); _builder.append(_upperCase_4); _builder.append("_"); String _upperCase_5 = RdlUtil.effectiveName(this.componentDefinition).toUpperCase(); _builder.append(_upperCase_5); _builder.append("_H_ */"); _builder.newLineIfNotEmpty(); _xblockexpression = _builder.toString(); } return _xblockexpression; } @Override public String generateSource(final String namespace) { String _xblockexpression = null; { ComponentDefinitionType _type = this.componentDefinition.getType(); boolean _notEquals = (!Objects.equal(_type, ComponentDefinitionType.REGFILE)); if (_notEquals) { return ""; } final Function1 _function = (Notifier it) -> { return Boolean.valueOf((it instanceof ComponentDefinition)); }; final Function1 _function_1 = (Notifier it) -> { return ((ComponentDefinition) it); }; final Function1 _function_2 = (ComponentDefinition it) -> { ComponentDefinitionType _type_1 = it.getType(); return Boolean.valueOf(Objects.equal(_type_1, ComponentDefinitionType.ADDRMAP)); }; final Function1 _function_3 = (ComponentDefinition def) -> { final Function1 _function_4 = (Instantiation it) -> { ComponentDefinition _componentRef = it.getComponentRef(); return Boolean.valueOf(Objects.equal(_componentRef, this.componentDefinition)); }; int _size = IterableExtensions.size(IterableExtensions.filter(def.getInstantiations(), _function_4)); return Boolean.valueOf((_size > 0)); }; final Iterator addrMaps = IteratorExtensions.filter(IteratorExtensions.filter(IteratorExtensions.map(IteratorExtensions.filter(this.componentDefinition.eResource().getResourceSet().getAllContents(), _function), _function_1), _function_2), _function_3); int _size = IteratorExtensions.size(addrMaps); boolean _equals = (_size == 0); if (_equals) { return ""; } StringConcatenation _builder = new StringConcatenation(); _builder.append("/*"); _builder.newLine(); _builder.append(" "); _builder.append("* Copyright (c) 2019 -2022 MINRES Technologies GmbH"); _builder.newLine(); _builder.append(" "); _builder.append("*"); _builder.newLine(); _builder.append(" "); _builder.append("* SPDX-License-Identifier: Apache-2.0"); _builder.newLine(); _builder.append(" "); _builder.append("*/"); _builder.newLine(); _builder.newLine(); _builder.append("#include \""); String _effectiveName = RdlUtil.effectiveName(this.componentDefinition); _builder.append(_effectiveName); _builder.append(".h\""); _builder.newLineIfNotEmpty(); _builder.append("#include \"gen/"); String _effectiveName_1 = RdlUtil.effectiveName(this.componentDefinition); _builder.append(_effectiveName_1); _builder.append(".h\""); _builder.newLineIfNotEmpty(); _builder.newLine(); _builder.append("#include "); _builder.newLine(); _builder.newLine(); _builder.append("namespace "); _builder.append(namespace); _builder.append(" {"); _builder.newLineIfNotEmpty(); _builder.append("SC_HAS_PROCESS("); String _effectiveName_2 = RdlUtil.effectiveName(this.componentDefinition); _builder.append(_effectiveName_2); _builder.append(");// NOLINT"); _builder.newLineIfNotEmpty(); _builder.newLine(); String _effectiveName_3 = RdlUtil.effectiveName(this.componentDefinition); _builder.append(_effectiveName_3); _builder.append("::"); String _effectiveName_4 = RdlUtil.effectiveName(this.componentDefinition); _builder.append(_effectiveName_4); _builder.append("(sc_core::sc_module_name nm)"); _builder.newLineIfNotEmpty(); _builder.append(": sc_core::sc_module(nm)"); _builder.newLine(); _builder.append(", scc::tlm_target<>(clk)"); _builder.newLine(); _builder.append(", NAMEDD(regs, gen::"); String _effectiveName_5 = RdlUtil.effectiveName(this.componentDefinition); _builder.append(_effectiveName_5); _builder.append("_regs) {"); _builder.newLineIfNotEmpty(); _builder.append(" "); _builder.append("regs->registerResources(*this);"); _builder.newLine(); _builder.append(" "); _builder.append("SC_METHOD(clock_cb);"); _builder.newLine(); _builder.append(" "); _builder.append("sensitive << clk_i;"); _builder.newLine(); _builder.append(" "); _builder.append("SC_METHOD(reset_cb);"); _builder.newLine(); _builder.append(" "); _builder.append("sensitive << rst_i;"); _builder.newLine(); _builder.append("}"); _builder.newLine(); _builder.newLine(); String _effectiveName_6 = RdlUtil.effectiveName(this.componentDefinition); _builder.append(_effectiveName_6); _builder.append("::~"); String _effectiveName_7 = RdlUtil.effectiveName(this.componentDefinition); _builder.append(_effectiveName_7); _builder.append("() {} // NOLINT"); _builder.newLineIfNotEmpty(); _builder.newLine(); _builder.append("void "); String _effectiveName_8 = RdlUtil.effectiveName(this.componentDefinition); _builder.append(_effectiveName_8); _builder.append("::clock_cb() { this->clk = clk_i.read(); }"); _builder.newLineIfNotEmpty(); _builder.newLine(); _builder.append("void "); String _effectiveName_9 = RdlUtil.effectiveName(this.componentDefinition); _builder.append(_effectiveName_9); _builder.append("::reset_cb() {"); _builder.newLineIfNotEmpty(); _builder.append(" "); _builder.append("if (rst_i.read()) {"); _builder.newLine(); _builder.append(" "); _builder.append("regs->reset_start();"); _builder.newLine(); _builder.append(" "); _builder.append("} else {"); _builder.newLine(); _builder.append(" "); _builder.append("regs->reset_stop();"); _builder.newLine(); _builder.append(" "); _builder.append("}"); _builder.newLine(); _builder.append("}"); _builder.newLine(); _builder.newLine(); _builder.append("} /* namespace "); _builder.append(namespace); _builder.append(" */"); _builder.newLineIfNotEmpty(); _xblockexpression = _builder.toString(); } return _xblockexpression; } }