/*
 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;
};
};  // namespace SURELOG

#endif /* FUNCTION_H */
