/*
 Copyright 2019 Alain Dargelas
 
 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.
 */

/* 
 * File:   Function.h
 * Author: alain
 *
 * Created on February 21, 2019, 8:19 PM
 */

#ifndef FUNCTION_H
#define FUNCTION_H
#include <string>
#include "../SourceCompile/SymbolTable.h"
#include "FileContent.h"
#include "../SourceCompile/VObjectTypes.h"
#include "DataType.h"
#include "Scope.h"
#include "TfPortItem.h"
#include "Statement.h"
#include "../Testbench/Variable.h"
#include "../DesignCompile/CompileHelper.h"

namespace SURELOG {

    class Procedure : public Scope, public Statement {
    public:

        Procedure(DesignComponent* parent, FileContent* fC, NodeId id, std::string name) : 
             Scope(name, NULL), Statement(this, NULL, fC, id, fC ? fC->Type(id) : VObjectType::slFunction_prototype), m_parent(parent), m_fileContent(fC), m_nodeId(id),
        m_name(name) {
        }

        ~Procedure() {
        }

        DesignComponent* getParent() {
            return m_parent;
        }

        std::string getName() {
            return m_name;
        }

        FileContent* getFileContent() {
            return m_fileContent;
        }

        NodeId getNodeId() {
            return m_nodeId;
        }

        TfPortList& getParams() {
            return m_params;
        }

    protected:
        DesignComponent* m_parent;
        FileContent* m_fileContent;
        NodeId m_nodeId;
        std::string m_name;
        TfPortList m_params;
    };

    
    class SeqBlock : public Scope, public Statement {
    public:

        SeqBlock(std::string name, Scope* parent, Statement* parentStmt, FileContent* fC, NodeId id) : Scope(name, parent), Statement(this, parentStmt, fC, id, fC ? fC->Type(id) : VObjectType::slSeq_block) {
        };
    };
    
    class Function : public Procedure {
    public:

        Function(DesignComponent* parent, FileContent* fC, NodeId id, std::string name, DataType* returnType) :
        Procedure(parent, fC, id, name), m_returnType(returnType) {
        }
        bool compile(CompileHelper& compile_helper);
        virtual ~Function();

        DataType* getReturnType() {
            return m_returnType;
        }

    private:
        DataType* m_returnType;
    };
};

#endif /* FUNCTION_H */


