! @brief Configures trace graph and starts thread.
        
        This method performs all steps required to start up SWV. It first calls the target's
        trace_start() method, which allows for target-specific trace initialization. Then it
        configures the TPIU and ITM modules. A simple trace data processing graph is created that
        connects an SWVEventSink with a SWOParser. Finally, the reader thread is started.
        
        If the debug probe does not support SWO, a warning is printed but nothing else is done.
        
        @param self
        @param sys_clock
        @param swo_clock
        @param console

def init(self, sys_clock, swo_clock, console):
        """! @brief Configures trace graph and starts thread.
        
        This method performs all steps required to start up SWV. It first calls the target's
        trace_start() method, which allows for target-specific trace initialization. Then it
        configures the TPIU and ITM modules. A simple trace data processing graph is created that
        connects an SWVEventSink with a SWOParser. Finally, the reader thread is started.
        
        If the debug probe does not support SWO, a warning is printed but nothing else is done.
        
        @param self
        @param sys_clock
        @param swo_clock
        @param console
        """
        self._swo_clock = swo_clock
        
        if not self._session.probe.has_swo():
            LOG.warning("Probe %s does not support SWO", self._session.probe.unique_id)
            return
        
        self._session.target.trace_start()
        
        itm = self._session.target.get_first_child_of_type(ITM)
        tpiu = self._session.target.get_first_child_of_type(TPIU)

        itm.init()
        itm.enable()
        tpiu.init()

        if tpiu.set_swo_clock(swo_clock, sys_clock):
            LOG.info("Set SWO clock to %d", swo_clock)
        else:
            LOG.warning("Failed to set SWO clock rate")
            return

        self._parser = SWOParser(self._session.target.cores[self._core_number])
        self._sink = SWVEventSink(console)
        self._parser.connect(self._sink)
        
        self.start()