111988Sandreas.sandberg@arm.com/*
211988Sandreas.sandberg@arm.com * Copyright (c) 2017 ARM Limited
311988Sandreas.sandberg@arm.com * All rights reserved
411988Sandreas.sandberg@arm.com *
511988Sandreas.sandberg@arm.com * The license below extends only to copyright in the software and shall
611988Sandreas.sandberg@arm.com * not be construed as granting a license to any other intellectual
711988Sandreas.sandberg@arm.com * property including but not limited to intellectual property relating
811988Sandreas.sandberg@arm.com * to a hardware implementation of the functionality of the software
911988Sandreas.sandberg@arm.com * licensed hereunder.  You may use the software subject to the license
1011988Sandreas.sandberg@arm.com * terms below provided that you ensure that this notice is replicated
1111988Sandreas.sandberg@arm.com * unmodified and in its entirety in all distributions of the software,
1211988Sandreas.sandberg@arm.com * modified or unmodified, in source code or in binary form.
1311988Sandreas.sandberg@arm.com *
1411988Sandreas.sandberg@arm.com * Copyright (c) 2006 The Regents of The University of Michigan
1511988Sandreas.sandberg@arm.com * Copyright (c) 2010 The Hewlett-Packard Development Company
1611988Sandreas.sandberg@arm.com * All rights reserved.
1711988Sandreas.sandberg@arm.com *
1811988Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without
1911988Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are
2011988Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright
2111988Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer;
2211988Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright
2311988Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the
2411988Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution;
2511988Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its
2611988Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from
2711988Sandreas.sandberg@arm.com * this software without specific prior written permission.
2811988Sandreas.sandberg@arm.com *
2911988Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
3011988Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3111988Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
3211988Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
3311988Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3411988Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3511988Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3611988Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3711988Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3811988Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3911988Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
4011988Sandreas.sandberg@arm.com *
4111988Sandreas.sandberg@arm.com * Authors: Nathan Binkert
4211988Sandreas.sandberg@arm.com *          Andreas Sandberg
4311988Sandreas.sandberg@arm.com */
4411988Sandreas.sandberg@arm.com
4511988Sandreas.sandberg@arm.com#include "pybind11/pybind11.h"
4611988Sandreas.sandberg@arm.com#include "pybind11/stl.h"
4711988Sandreas.sandberg@arm.com
4811988Sandreas.sandberg@arm.com#include <map>
4911988Sandreas.sandberg@arm.com#include <vector>
5011988Sandreas.sandberg@arm.com
5111988Sandreas.sandberg@arm.com#include "base/debug.hh"
5211988Sandreas.sandberg@arm.com#include "base/output.hh"
5311988Sandreas.sandberg@arm.com#include "base/trace.hh"
5411988Sandreas.sandberg@arm.com#include "sim/debug.hh"
5511988Sandreas.sandberg@arm.com
5611988Sandreas.sandberg@arm.comnamespace py = pybind11;
5711988Sandreas.sandberg@arm.com
5811988Sandreas.sandberg@arm.comnamespace Debug {
5911988Sandreas.sandberg@arm.comextern int allFlagsVersion;
6011988Sandreas.sandberg@arm.com}
6111988Sandreas.sandberg@arm.com
6211988Sandreas.sandberg@arm.comstatic void
6311988Sandreas.sandberg@arm.comoutput(const char *filename)
6411988Sandreas.sandberg@arm.com{
6511988Sandreas.sandberg@arm.com    OutputStream *file_stream = simout.find(filename);
6611988Sandreas.sandberg@arm.com
6711988Sandreas.sandberg@arm.com    if (!file_stream)
6811988Sandreas.sandberg@arm.com        file_stream = simout.create(filename);
6911988Sandreas.sandberg@arm.com
7011988Sandreas.sandberg@arm.com    Trace::setDebugLogger(new Trace::OstreamLogger(*file_stream->stream()));
7111988Sandreas.sandberg@arm.com}
7211988Sandreas.sandberg@arm.com
7311988Sandreas.sandberg@arm.comstatic void
7411988Sandreas.sandberg@arm.comignore(const char *expr)
7511988Sandreas.sandberg@arm.com{
7611988Sandreas.sandberg@arm.com    ObjectMatch ignore(expr);
7711988Sandreas.sandberg@arm.com
7813804Sisaac.sanchez@bsc.es    Trace::getDebugLogger()->addIgnore(ignore);
7911988Sandreas.sandberg@arm.com}
8011988Sandreas.sandberg@arm.com
8111988Sandreas.sandberg@arm.comvoid
8211988Sandreas.sandberg@arm.compybind_init_debug(py::module &m_native)
8311988Sandreas.sandberg@arm.com{
8411988Sandreas.sandberg@arm.com    py::module m_debug = m_native.def_submodule("debug");
8511988Sandreas.sandberg@arm.com
8611988Sandreas.sandberg@arm.com    m_debug
8711988Sandreas.sandberg@arm.com        .def("getAllFlagsVersion", []() { return Debug::allFlagsVersion; })
8811988Sandreas.sandberg@arm.com        .def("allFlags", &Debug::allFlags, py::return_value_policy::reference)
8911988Sandreas.sandberg@arm.com        .def("findFlag", &Debug::findFlag)
9011988Sandreas.sandberg@arm.com        .def("setDebugFlag", &setDebugFlag)
9111988Sandreas.sandberg@arm.com        .def("clearDebugFlag", &clearDebugFlag)
9211988Sandreas.sandberg@arm.com        .def("dumpDebugFlags", &dumpDebugFlags)
9311988Sandreas.sandberg@arm.com
9411988Sandreas.sandberg@arm.com        .def("schedBreak", &schedBreak)
9511988Sandreas.sandberg@arm.com        .def("setRemoteGDBPort", &setRemoteGDBPort)
9611988Sandreas.sandberg@arm.com        ;
9711988Sandreas.sandberg@arm.com
9811988Sandreas.sandberg@arm.com    py::class_<Debug::Flag> c_flag(m_debug, "Flag");
9911988Sandreas.sandberg@arm.com    c_flag
10011988Sandreas.sandberg@arm.com        .def("name", &Debug::Flag::name)
10111988Sandreas.sandberg@arm.com        .def("desc", &Debug::Flag::desc)
10211988Sandreas.sandberg@arm.com        .def("kids", &Debug::Flag::kids)
10311988Sandreas.sandberg@arm.com        .def("enable", &Debug::Flag::enable)
10411988Sandreas.sandberg@arm.com        .def("disable", &Debug::Flag::disable)
10511988Sandreas.sandberg@arm.com        .def("sync", &Debug::Flag::sync)
10611988Sandreas.sandberg@arm.com        ;
10711988Sandreas.sandberg@arm.com
10811988Sandreas.sandberg@arm.com    py::class_<Debug::SimpleFlag>(m_debug, "SimpleFlag", c_flag);
10911988Sandreas.sandberg@arm.com    py::class_<Debug::CompoundFlag>(m_debug, "CompoundFlag", c_flag);
11011988Sandreas.sandberg@arm.com
11111988Sandreas.sandberg@arm.com
11211988Sandreas.sandberg@arm.com    py::module m_trace = m_native.def_submodule("trace");
11311988Sandreas.sandberg@arm.com    m_trace
11411988Sandreas.sandberg@arm.com        .def("output", &output)
11511988Sandreas.sandberg@arm.com        .def("ignore", &ignore)
11611988Sandreas.sandberg@arm.com        .def("enable", &Trace::enable)
11711988Sandreas.sandberg@arm.com        .def("disable", &Trace::disable)
11811988Sandreas.sandberg@arm.com        ;
11911988Sandreas.sandberg@arm.com}
120