diff --git a/src/systemc/SConscript b/src/systemc/SConscript
new file mode 100644
index 0000000..40ad8fc
--- /dev/null
+++ b/src/systemc/SConscript
@@ -0,0 +1,33 @@
+# Copyright 2018 Google, Inc.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met: redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer;
+# redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution;
+# neither the name of the copyright holders nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Authors: Gabe Black
+
+Import('*')
+
+if env['USE_SYSTEMC']:
+    SimObject('SystemC.py')
+
+    Source('sc_object.cc')
diff --git a/src/systemc/SConsopts b/src/systemc/SConsopts
new file mode 100644
index 0000000..f3da63d
--- /dev/null
+++ b/src/systemc/SConsopts
@@ -0,0 +1,34 @@
+# Copyright 2018 Google, Inc.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met: redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer;
+# redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution;
+# neither the name of the copyright holders nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Authors: Gabe Black
+
+Import('*')
+
+sticky_vars.AddVariables(
+    BoolVariable('USE_SYSTEMC', 'Enable SystemC API support', False)
+    )
+
+export_vars.append('USE_SYSTEMC')
diff --git a/src/systemc/SystemC.py b/src/systemc/SystemC.py
new file mode 100644
index 0000000..07ca84b
--- /dev/null
+++ b/src/systemc/SystemC.py
@@ -0,0 +1,49 @@
+# Copyright 2018 Google, Inc.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met: redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer;
+# redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution;
+# neither the name of the copyright holders nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Authors: Gabe Black
+
+from m5.SimObject import SimObject
+
+# This class represents systemc sc_object instances in python config files. It
+# inherits from SimObject in python, but the c++ version, sc_core::sc_object,
+# doesn't inherit from gem5's c++ SimObject class.
+class SystemC_ScObject(SimObject):
+    type = 'SystemC_ScObject'
+    abstract = True
+    cxx_class = 'sc_core::sc_object'
+    cxx_header = 'systemc/sc_object.hh'
+
+    # Clear cxx_base to stop the c++ binding code from assuming
+    # sc_core::sc_object inherits from SimObject, even though SystemC_ScObject
+    # does on the python side.
+    cxx_base = None
+
+    # Hide the cxx_exports from SimObject since we don't inherit from
+    # SimObject on the c++ side and so don't have those methods to call down
+    # into.
+    locals().update({
+        method.name: (lambda *a, **k: None) for method in SimObject.cxx_exports
+    })
diff --git a/src/systemc/sc_object.cc b/src/systemc/sc_object.cc
new file mode 100644
index 0000000..6b9fc25
--- /dev/null
+++ b/src/systemc/sc_object.cc
@@ -0,0 +1,178 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Gabe Black
+ */
+
+#include "systemc/sc_object.hh"
+
+#include "base/logging.hh"
+
+namespace sc_core
+{
+
+const char *
+sc_object::name() const
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return "sc_object";
+}
+
+const char *
+sc_object::basename() const
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return "sc_object";
+}
+
+const char *
+sc_object::kind() const
+{
+    return "sc_object";
+}
+
+void
+sc_object::print(std::ostream &out) const
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+}
+
+void
+sc_object::dump(std::ostream &out) const
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+}
+
+const std::vector<sc_object *> &
+sc_object::get_child_objects() const
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return *(const std::vector<sc_object *> *)nullptr;
+}
+
+const std::vector<sc_event *> &
+sc_object::get_child_events() const
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return *(const std::vector<sc_event *> *)nullptr;
+}
+
+sc_object *
+sc_object::get_parent_object() const
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return NULL;
+}
+
+bool
+sc_object::add_attribute(sc_attr_base &)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return false;
+}
+
+sc_attr_base *
+sc_object::get_attribute(const std::string &)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return NULL;
+}
+
+sc_attr_base *
+sc_object::remove_attribute(const std::string &)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return NULL;
+}
+
+void
+sc_object::remove_all_attributes()
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+}
+
+int
+sc_object::num_attributes() const
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return 0;
+}
+
+sc_attr_cltn &
+sc_object::attr_cltn()
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return *(sc_attr_cltn *)NULL;
+}
+
+const sc_attr_cltn &
+sc_object::attr_cltn() const
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return *(sc_attr_cltn *)NULL;
+}
+
+sc_object::sc_object()
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+}
+
+sc_object::sc_object(const char *name)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+}
+
+sc_object::sc_object(const sc_object &arg)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+}
+
+sc_object &
+sc_object::operator = (const sc_object &)
+{
+    return *this;
+}
+
+sc_object::~sc_object()
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+}
+
+const std::vector<sc_object *> &
+sc_get_top_level_objects()
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return *(const std::vector<sc_object *> *)nullptr;
+}
+
+sc_object *
+sc_find_object(const char *)
+{
+    warn("%s not implemented.\n", __PRETTY_FUNCTION__);
+    return NULL;
+}
+
+} // namespace sc_core
diff --git a/src/systemc/sc_object.hh b/src/systemc/sc_object.hh
new file mode 100644
index 0000000..51ca197
--- /dev/null
+++ b/src/systemc/sc_object.hh
@@ -0,0 +1,80 @@
+/*
+ * Copyright 2018 Google, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * Authors: Gabe Black
+ */
+
+#ifndef __SYSTEMC_SC_OBJECT_HH__
+#define __SYSTEMC_SC_OBJECT_HH__
+
+#include <iostream>
+#include <string>
+#include <vector>
+
+namespace sc_core
+{
+
+class sc_event;
+class sc_attr_base;
+class sc_attr_cltn;
+
+class sc_object
+{
+  public:
+    const char *name() const;
+    const char *basename() const;
+
+    virtual const char *kind() const;
+
+    virtual void print(std::ostream & =std::cout) const;
+    virtual void dump(std::ostream & =std::cout) const;
+
+    virtual const std::vector<sc_object *> &get_child_objects() const;
+    virtual const std::vector<sc_event *> &get_child_events() const;
+    sc_object *get_parent_object() const;
+
+    bool add_attribute(sc_attr_base &);
+    sc_attr_base *get_attribute(const std::string &);
+    sc_attr_base *remove_attribute(const std::string &);
+    void remove_all_attributes();
+    int num_attributes() const;
+    sc_attr_cltn &attr_cltn();
+    const sc_attr_cltn &attr_cltn() const;
+
+  protected:
+    sc_object();
+    sc_object(const char *);
+    sc_object(const sc_object &);
+    sc_object &operator = (const sc_object &);
+    virtual ~sc_object();
+};
+
+const std::vector<sc_object *> &sc_get_top_level_objects();
+sc_object *sc_find_object(const char *);
+
+} // namespace sc_core
+
+#endif  //__SYSTEMC_SC_OBJECT_HH__
